TreeTransform.h revision 85737a71fee8c737f7cfba79a0aca89298fe573b
1a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall//===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===/
2577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
3577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//                     The LLVM Compiler Infrastructure
4577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
5577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file is distributed under the University of Illinois Open Source
6577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// License. See LICENSE.TXT for details.
7577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
8577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
9577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  This file implements a semantic tree transformation that takes a given
10577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  AST and rebuilds it, possibly transforming some nodes in the process.
11577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
12577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
13577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H
15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "Sema.h"
17dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
18c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
19657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
20b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
25a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h"
26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h"
27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h"
28b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
29a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h"
30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
63670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
7043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningStmtResult OwningStmtResult;
92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningExprResult OwningExprResult;
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::StmtArg StmtArg;
94b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::ExprArg ExprArg;
95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
9643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  typedef Sema::MultiStmtArg MultiStmtArg;
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, returns no source-location information. Subclasses can
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  DeclarationName Entity) : Self(Self) {
152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determine whether the given type \p T has already been
163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// to short-circuit evaluation when it is known that a given type will
167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by creating a
176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// DeclaratorInfo for it and delegating to the appropriate
177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// function.  This is expensive, but we don't mind, because
178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// this method is deprecated anyway;  all users should be
179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// switched to storing DeclaratorInfos.
180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType TransformType(QualType T);
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transforms the given type-with-location into a new
185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type-with-location.
186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ///
187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by delegating to the
188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// appropriate TransformXXXType to build a new type.  Subclasses
189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// may override this function (to take over all type
190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// transformations) or some set of the TransformXXXType functions
191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// to alter the transformation.
192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DeclaratorInfo *TransformType(DeclaratorInfo *DI);
193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
200657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
20343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
20443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
20543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
20643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
20743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
20843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
211657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
212657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E) {
220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Transform the given expression.
224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
236dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
237dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  Decl *TransformDecl(Decl *D) { return D; }
23943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
24043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
24443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); }
2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2466cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
2476cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
2486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// This specific declaration transformation only applies to the first
2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    return cast_or_null<NamedDecl>(getDerived().TransformDecl(D));
2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor
259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
262dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
263dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
265a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
266c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
267c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
27081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
27181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName TransformDeclarationName(DeclarationName Name,
276dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           SourceLocation Loc,
277dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           QualType ObjectType = QualType());
2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
281d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
291670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
292670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
293833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
294833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a DeclaratorInfo for a type.
303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  DeclaratorInfo *InventDeclaratorInfo(QualType T) {
304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return SemaRef.Context.getTrivialDeclaratorInfo(T,
305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
31485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
315dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  QualType
316dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
317dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType
320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TransformTemplateSpecializationType(TypeLocBuilder &TLB,
321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      TemplateSpecializationTypeLoc TL,
322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      QualType ObjectType);
323dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
32443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
32743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Transform##Node(Node *E);
330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent)
331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
33785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
34385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
34585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
34785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
34885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
34985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
35185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
35285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
35585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new Objective C object pointer type.
36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildObjCObjectPointerType(QualType PointeeType,
36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        SourceLocation Sigil);
368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
39185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
39285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
40185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
40285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4767da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4777da2431c23ef1ee8acb114e39692246e1801afc2John McCall  /// \brief Build a new elaborated type.
4787da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
4797da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return SemaRef.Context.getElaboratedType(T, Tag);
4807da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
4811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
4981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
506833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation LAngleLoc,
507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             const TemplateArgumentLoc *Args,
508833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             unsigned NumArgs,
509833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation RAngleLoc);
5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, builds a new QualifiedNameType type from the
5141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// nested-name-specifier and the named type. Subclasses may override
515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
5181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypenameType type from the nested-name-specifier
5231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and the given type. Subclasses may override this routine to provide
524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NNS->isDependent())
5271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Context.getTypenameType(NNS,
528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
5361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// (or qualified name type). Subclasses may override this routine to provide
537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
5381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
539833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                               const IdentifierInfo *Id,
540833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                               SourceRange SR) {
541833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return SemaRef.CheckTypenameType(NNS, *Id, SR);
542dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
549dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
550dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
551dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
552a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
553c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
554c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
556dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
557dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
558dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
559dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
562dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
574dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
575dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  QualType T);
576d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
578d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
579d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
580d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
581d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
582d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
583d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
584d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
586d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
587d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
588d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and a set of
589d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// overloaded function templates.
590d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
591d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
592d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
593d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
594d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
595d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   OverloadedFunctionDecl *Ovl);
5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
597d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
598d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
599d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
600d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
601d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
602d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
603d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
604d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
6053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
6063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
6071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound 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 RebuildCompoundStmt(SourceLocation LBraceLoc,
61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
6301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
6501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
6701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 StmtArg Then, SourceLocation ElseLoc,
67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 StmtArg Else) {
67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else));
67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) {
68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnStartOfSwitchStmt(move(Cond));
68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    Sema::FullExprArg Cond,
69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body));
70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
7121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  StmtArg Init, ExprArg Cond, ExprArg Inc,
72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond),
72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  move(Inc), RParenLoc, move(Body));
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
7631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                DeclaratorInfo *Declarator,
77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
7931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
80043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
80343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
811a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
812a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
813a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      NamedDecl *ND, SourceLocation Loc) {
814a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
815a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
816a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildDeclarationNameExpr(Loc, ND,
818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false,
819a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                              &SS,
820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false);
821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
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 RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
832a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
834a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
835a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
836a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
837a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
838a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
839a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              SourceLocation DestroyedTypeLoc,
840a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  QualType DestroyedType,
841a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                               NestedNameSpecifier *Qualifier,
842a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceRange QualifierRange) {
843a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CXXScopeSpec SS;
844a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (Qualifier) {
845a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setRange(QualifierRange);
846a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setScopeRep(Qualifier);
847a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    }
848a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    DeclarationName Name
850a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      = SemaRef.Context.DeclarationNames.getCXXDestructorName(
851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                               SemaRef.Context.getCanonicalType(DestroyedType));
8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              OperatorLoc,
855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              isArrow? tok::arrow : tok::period,
856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              DestroyedTypeLoc,
857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Name,
858a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Sema::DeclPtrTy::make((Decl *)0),
859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              &SS);
8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
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 RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
8831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
8931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
8991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
92983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
93083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
93183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     NamedDecl *Member) {
933d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
934d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
935d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
9361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
938d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson        new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
939d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
940d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
941d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
942d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
94483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
94583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
94683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
94783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
94883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
94983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
950017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              isArrow? tok::arrow : tok::period,
952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              MemberLoc,
953017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                              Member->getDeclName(),
95483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
95583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                              &SS);
956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
9591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
9661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     (Expr *)RHS.get());
968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
9701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    LHS.release();
972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    RHS.release();
973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new implicit cast expression.
9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new implicit cast without any semantic analysis.
992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr, bool isLvalue) {
995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ImplicitCastExpr *ICE
9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      = new (getSema().Context) ImplicitCastExpr(T, Kind,
997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 (Expr *)SubExpr.release(),
998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 isLvalue);
999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(ICE);
1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType ExplicitTy,
1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCastExpr(/*Scope=*/0,
1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   LParenLoc,
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   ExplicitTy.getAsOpaquePtr(),
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc,
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(SubExpr));
1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
10181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T,
1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          RParenLoc, move(Init));
1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              tok::period, AccessorLoc,
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Accessor,
1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RBraceLoc) {
1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
10541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
10671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
10821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
11031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
11521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
11651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
11821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
11831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
11871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
11881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
11911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
11931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
11941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
11961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
12011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            QualType T,
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             QualType T,
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
12651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                QualType T,
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
127888650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
128288650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
13151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
13161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      QualType ThisType) {
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
1342f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
13541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
13551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ conditional declaration expression.
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation EqLoc,
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               VarDecl *Var) {
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    EqLoc,
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    Var));
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
13881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
14231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                bool IsAddressOfOperand) {
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
14401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Location,
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Name,
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*Trailing lparen=*/false,
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              &SS,
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              IsAddressOfOperand);
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1452f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier,
1453f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                         SourceRange QualifierRange,
1454f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                         TemplateName Template,
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation TemplateLoc,
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LAngleLoc,
1457833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc *TemplateArgs,
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         unsigned NumTemplateArgs,
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RAngleLoc) {
1460f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange,
1461f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                         Template, TemplateLoc,
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         LAngleLoc,
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgs, NumTemplateArgs,
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         RAngleLoc);
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
1475ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson    return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1476ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           SourceLocation(),
1477ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           T, Constructor, IsElidable,
1478f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson                                           move(Args));
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15220dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1525a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1526a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1528c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1529c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
15300dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor    OwningExprResult Base = move(BaseE);
1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1532a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1534a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1535a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(Base), OperatorLoc, OpKind,
1539017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            MemberLoc,
1540017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            Name,
1541a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                    /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
1542c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            &SS,
1543c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            FirstQualifierInScope);
1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
15463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// \brief Build a new member reference expression with explicit template
15473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// arguments.
15483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
15493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
15503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
15523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  bool IsArrow,
15533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation OperatorLoc,
15543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                NestedNameSpecifier *Qualifier,
15553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceRange QualifierRange,
15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  TemplateName Template,
15573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                SourceLocation TemplateNameLoc,
15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NamedDecl *FirstQualifierInScope,
15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation LAngleLoc,
1560833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                       const TemplateArgumentLoc *TemplateArgs,
15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  unsigned NumTemplateArgs,
15623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation RAngleLoc) {
15633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OwningExprResult Base = move(BaseE);
15643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
15651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
15673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
15683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
15691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // FIXME: We're going to end up looking up the template based on its name,
15713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr.
15723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    DeclarationName Name;
15733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
15743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = ActualTemplate->getDeclName();
15751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else if (OverloadedFunctionDecl *Ovl
15763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor               = Template.getAsOverloadedFunctionDecl())
15773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Ovl->getDeclName();
15783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    else
15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Template.getAsDependentTemplateName()->getName();
15801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
15823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              OperatorLoc, OpKind,
15833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              TemplateNameLoc, Name, true,
15843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              LAngleLoc, TemplateArgs,
15853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NumTemplateArgs, RAngleLoc,
15863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              Sema::DeclPtrTy(), &SS);
15873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
15881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
15981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
16141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                             RParenLoc));
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
16251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
16301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
16331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          BuiltinLoc, false, false);
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
16461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
16511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
165943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
166043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
16611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
166343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
16641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
166643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
166743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
166943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
16701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
167143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
167243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
167443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
167543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
167843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().Owned(E.takeAs<Stmt>());
168143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
168543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1688670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    bool isAddressOfOperand) {
1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
17001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1703657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1704657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1705657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1708a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1709c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1710c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
17110979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
17120979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
17131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
171443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1716dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
17171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1718c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1719c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
1724c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
1725a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
1726c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
1732a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
1733a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1734a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1738a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
1739c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
1740c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
1744dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                            getDerived().TransformDecl(NNS->getAsNamespace()));
17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1754dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
17581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1761fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
1762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1763d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1764d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
17651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1766dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1767dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1769dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
17721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1773dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   T);
1774dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
17781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
1779dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1780dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1781dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
17821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
178381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
1784dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 SourceLocation Loc,
1785dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 QualType ObjectType) {
178681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
178981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
179081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
179281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
179381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
179481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
179581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
179681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
17971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
179881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
179981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
180081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
180181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
1802dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    QualType T;
1803dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    if (!ObjectType.isNull() &&
1804dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1805dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      TemplateSpecializationType *SpecType
1806dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        = cast<TemplateSpecializationType>(Name.getCXXNameType());
1807dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = TransformTemplateSpecializationType(SpecType, ObjectType);
1808dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    } else
1809dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = getDerived().TransformType(Name.getCXXNameType());
181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
181181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
18121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
18141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
181581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
181681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
18171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
18181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
182081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
182181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
182281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
18231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
18243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
18253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
1826d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
18271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1831d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
18341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
1835d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1837d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
18381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
18471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    assert(Ovl && "Not a template name or an overload set?");
18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OverloadedFunctionDecl *TransOvl
1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1852d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransOvl)
1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        NNS == QTN->getQualifier() &&
1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransOvl == Ovl)
1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1860d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TransOvl);
1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
18651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
18683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1872dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
1873dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType);
1877d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1879d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
18801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1882d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1883d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1885d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1886d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1887d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1889d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1890d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1892d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1893d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  assert(Ovl && "Not a template name or an overload set?");
18941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OverloadedFunctionDecl *TransOvl
1895d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1896d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!TransOvl)
1897d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName();
18981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1899d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1900d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      TransOvl == Ovl)
1901d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return Name;
19021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1903d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return TemplateName(TransOvl);
1904d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1905d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1906d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
1907833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
1908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
1909833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
1911670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1912670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    llvm::llvm_unreachable("null template argument in TreeTransform");
1914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1916833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
1917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
1918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall               SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc));
1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
1923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
1924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
1927670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1928833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
1929828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
1935833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
1936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
1941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
1942833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
1943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1945670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DeclaratorInfo *DI = Input.getSourceDeclaratorInfo();
1947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
1948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      DI = InventDeclaratorInfo(Input.getArgument().getAsType());
1949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
1952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1953833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
1954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1955670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1957670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
1959972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
1960972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
1961972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
1962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemporaryBase Rebase(*this, SourceLocation(), Name);
1963670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1964833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
1965833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1966828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
1967828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
1968828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
1969828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
1970828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
1971828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (E.isInvalid())
1972828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = NULL;
1973828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      else {
1974828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = E.takeAs<Expr>();
1975828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr->Retain();
1976828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      }
1977828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
1978828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
1979828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
1980833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1981670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1983670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
1984670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
19851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
1986670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
1989833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
1990833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1991833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
1992833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
1993833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
1994833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1995833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *ETaken = E.takeAs<Expr>();
1996828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    ETaken->Retain();
1997833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
1998833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1999670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2001670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2002670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2003670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
20041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2005670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2006670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2008833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2009833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2010833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2011828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2012828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2013828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2014828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2015833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2017828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2018670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2019670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
20201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2021670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2022828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2023833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2027670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2028833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2029670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2030670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) {
2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2042a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T);
20434802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2045a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DeclaratorInfo *NewDI = getDerived().TransformType(DI);
20461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallDeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) {
2055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
20571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
20591bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2061a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, TL);
2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TLB.getDeclaratorInfo(SemaRef.Context, Result);
2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  llvm::llvm_unreachable("unhandled type loc!");
2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
20901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
20911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               QualifiedTypeLoc T) {
2094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Qualifiers Quals = T.getType().getQualifiers();
2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
21051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Result = SemaRef.Context.getQualifiedType(Result, Quals);
2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.push<QualifiedTypeLoc>(Result);
2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // No location information to preserve.
2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make
2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work.
2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \
2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType                                       \
2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(TLB, TL.getPointeeLoc());   \
2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (PointeeType.isNull())                                  \
2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();                                       \
2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();                            \
2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||                        \
2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != TL.getPointeeLoc().getType()) {         \
213385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().Rebuild##TypeClass(PointeeType,    \
213485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                          TL.getSigilLoc()); \
2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())                                     \
2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();                                     \
2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }                                                          \
2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result);    \
2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setSigilLoc(TL.getSigilLoc());                        \
2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;                                             \
2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0)
2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      BuiltinTypeLoc T) {
2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB,
2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   FixedWidthIntTypeLoc T) {
2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ComplexTypeLoc T) {
2161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2162a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      PointerTypeLoc TL) {
2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(PointerType);
2169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                  BlockPointerTypeLoc TL) {
2175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(BlockPointerType);
2176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
217885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
217985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
218085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
218185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
218285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
218385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
218485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
218585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               ReferenceTypeLoc TL) {
218685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
218785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
218885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
218985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
219085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
219185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
219285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
219385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
219485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
219585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
219685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
219785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
219885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
219985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
220085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
220485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
220585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
220685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
220785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
220985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
221085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
221285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
221385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2214a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2215a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2216a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2217a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 LValueReferenceTypeLoc TL) {
221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return TransformReferenceType(TLB, TL);
2219a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
22201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2221a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2222a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2223a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2224a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 RValueReferenceTypeLoc TL) {
222585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return TransformReferenceType(TLB, TL);
2226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
22291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2230a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2231a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   MemberPointerTypeLoc TL) {
2232a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2233a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2238a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
224885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
224985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2251a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2252a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
22601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ConstantArrayTypeLoc TL) {
2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2271a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
227585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
227685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
22841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              IncompleteArrayTypeLoc TL) {
2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
230985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
231085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   VariableArrayTypeLoc TL) {
2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2332670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2333670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2334670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2343a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
235085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
23601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             DependentSizedArrayTypeLoc TL) {
2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2373670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2374670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
23751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
239185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      DependentSizedExtVectorTypeLoc TL) {
2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2418670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2419670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2420670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2427eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2428eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     VectorTypeLoc TL) {
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements());
2462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2465a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
24681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                        ExtVectorTypeLoc TL) {
2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2485a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
24921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   FunctionProtoTypeLoc TL) {
2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ResultType.isNull())
2503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Transform the parameters.
2506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<QualType, 4> ParamTypes;
2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2508a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo();
2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      assert(OldDI->getType() == T->getArgType(i));
2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      DeclaratorInfo *NewDI = getDerived().TransformType(OldDI);
2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (!NewDI)
2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewDI == OldDI)
2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = OldParm;
2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      else
2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = ParmVarDecl::Create(SemaRef.Context,
2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getDeclContext(),
2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getLocation(),
2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getIdentifier(),
2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI->getType(),
2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI,
2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getStorageClass(),
2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      /* DefArg */ NULL);
2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
25451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamTypes.push_back(NewType);
2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamDecls.push_back(NewParm);
2548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
25491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getTypeQuals());
2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
25621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 FunctionNoProtoTypeLoc TL) {
2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2590a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypedefTypeLoc TL) {
2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
2598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
2605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
26121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypeOfExprTypeLoc TL) {
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprType *T = TL.getTypePtr();
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2621670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
2622670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
26231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
26361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     TypeOfTypeLoc TL) {
2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfType *T = TL.getTypePtr();
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: should be an inner type, or at least have a DeclaratorInfo.
2649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Underlying.isNull())
2651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfType(Underlying);
2657a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
26601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2662a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       DecltypeTypeLoc TL) {
2670a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2672670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
2673670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
26741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
26901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2692577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2693577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2694577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     RecordTypeLoc TL) {
2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
2698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
2701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
2706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
27101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   EnumTypeLoc TL) {
2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
2721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
2724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27397da2431c23ef1ee8acb114e39692246e1801afc2John McCall
27407da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ElaboratedTypeLoc TL) {
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedType *T = TL.getTypePtr();
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this should be a nested type.
27467da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
27477da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
27487da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
27491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2752a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
27627da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
27631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TemplateTypeParmTypeLoc TL) {
2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
2770577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2771577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
27721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
277349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         SubstTemplateTypeParmTypeLoc TL) {
2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
277749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
277849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
277949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
2780dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType
2781dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType(
2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TypeLocBuilder &TLB,
2783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TemplateSpecializationTypeLoc TL) {
2784833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(TLB, TL, QualType());
2785833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2787833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2788833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2789833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
2790833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2791833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
2792833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2794833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
2795833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
2796833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
2797833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
2798833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2799828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
2800828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2801828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
2802828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
2803828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
2804833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2805833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
2806833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
2809833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2810833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2811833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
2812833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
2813dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
2814dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
2815dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
2816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2817833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
2818833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
2819833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
28221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
2823dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
2824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
2825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2827833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  llvm::SmallVector<TemplateArgumentLoc, 4> NewTemplateArgs(T->getNumArgs());
2828833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i)
2829833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i),
2830833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                               NewTemplateArgs[i]))
2831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
28321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
2834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2835833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
2836833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
2837833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
2838833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getLAngleLoc(),
2839833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   NewTemplateArgs.data(),
2840833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   NewTemplateArgs.size(),
2841833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getRAngleLoc());
28421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2843833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
2844833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
2845833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
2846833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
2847833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
2848833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
2849833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
2850833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
2851833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
28521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2853833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
2854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2857a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2858a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   QualifiedNameTypeLoc TL) {
2860a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameType *T = TL.getTypePtr();
2861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2862577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2863577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                SourceRange());
2864577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2865577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2867577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2869577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
2874a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Named != T->getNamedType()) {
2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2878a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2880a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2881a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2882a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2883a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       TypenameTypeLoc TL) {
2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameType *T = TL.getTypePtr();
2890833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2891833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /* FIXME: preserve source information better than this */
2892833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceRange SR(TL.getNameLoc());
2893833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2895833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR);
2896577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result;
2900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2901577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
29021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType NewTemplateId
2903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
2904577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
2905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
29061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2907577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2908577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
2909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
2910577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
29111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
2913a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR);
2915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2916a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2917a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2918a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2919a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
2920a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2922a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2926a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ObjCInterfaceTypeLoc TL) {
292954e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCInterfaceType unimplemented");
293054e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
2931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               ObjCObjectPointerTypeLoc TL) {
293754e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCObjectPointerType unimplemented");
293854e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
293924fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
294024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
2941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
294243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
294343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
294443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
294543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
294843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
294943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
295043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
295143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
295243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
295343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
295443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
295543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
295643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
295743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
295943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
296143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
296243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
296343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
296443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
296543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
29671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
297043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
29711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
29741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
29811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // The case value expressions are not potentially evaluated.
298643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
29871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the left-hand case value.
298943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (LHS.isInvalid())
299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the right-hand case value (for the GNU case-range extension).
299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (RHS.isInvalid())
299643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
299943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
300043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
300143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
300243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
300343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
300443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
300543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
300643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
300743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
300943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
301043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
301143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
301243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
301543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
303143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
303843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
304143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
30451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
30461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
304843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
30531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
306143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
306443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
306643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
306743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
30681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
30691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
307043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
30711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
307243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
307343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
307443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
307543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
307743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
307943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
309543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
309843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
310043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
310143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
310243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
310343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
31061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
310943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
311043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
311243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
311343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
311443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
311743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
311843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
312143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
312243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
312443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
312543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
313143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
314443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
314743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
314943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
315143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
315243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
315343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
315443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
315643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
315743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
315943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
316243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
316743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
317043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
317343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
317443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     move(Init), move(Cond), move(Inc),
317543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
317743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
317843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
31791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
31801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
31821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
31951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
320043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
32041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
320843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
32101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
321143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
321343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
321443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
321643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
321743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
321843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
321943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
32201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
322143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
322243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
322343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
322543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
322643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition(*D);
323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
323443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
32351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
32381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
32411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
32431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
32441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
324743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
325043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
32531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
325443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
325643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
325943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement!
326043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Inline assembly cannot be transformed");
32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
326243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
326343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
326643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @try statement");
32701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
327143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
327443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
327743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @catch statement");
327843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @finally statement");
32861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @throw statement");
32941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
329543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @synchronized statement");
33031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
330643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C for-each statement");
33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
331343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
331543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
331643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
331743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
331843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
331943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
332143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
332243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
332343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
332443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
332543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
332643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
332743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
33291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getDeclaratorInfo(),
333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
333543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
333843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
334143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
33431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
334643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
334843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
33511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
335443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
33551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
335743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
336043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
33661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
33701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
337443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
33751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
33791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
338043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
33831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
33871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
33901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
3394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
3395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
33961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
33991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
34001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
34011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
3405a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
3406a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
3407a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3408a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                       E->getQualifierRange());
3409a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
3410a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3411a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3412a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
34131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *ND
3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3418a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3419a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
3420a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
3421a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      !E->hasExplicitTemplateArgumentList())
34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3424a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // FIXME: We're losing the explicit template arguments in this transformation.
3425a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3426833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
3427a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3428833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
3429833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                               TransArgs[I]))
3430a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3431a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3432a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3433a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // FIXME: Pass the qualifier/qualifier range along.
3434a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
3435a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                         ND, E->getLocation());
3436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
34391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
34411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
34451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
34471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
34511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
34591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
34631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
34651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
34691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
3471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
34761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
34771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
3480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
34901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
34911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
3495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
34981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
3500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
35015557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor    TemporaryBase Rebase(*this, E->getOperatorLoc(), DeclarationName());
35025557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
3503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getArgumentType());
3504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
35061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
3508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
35091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
35111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
3513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
35141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
35161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
3517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
3519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
35211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
3532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
3554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
3568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
35741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
35781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
3581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
35821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
35871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
3594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
35991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
360483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
360583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
36061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
360783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
360883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                                  E->getQualifierRange());
3609c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
361083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
361183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
36121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *Member
3614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
362083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Member == E->getMemberDecl())
36221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
363083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
363183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        Member);
3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
36381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
36401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
36451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
36571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
36581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
36631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CompoundAssignOperator *E) {
3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformBinaryOperator(E);
3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
36721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
36901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
369247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
36931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
369447e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
37001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
37015557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
37025557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
37035557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have type information here? It seems like we won't,
37045557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // so do we even need to transform the type?
3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
37161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
37191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              move(SubExpr),
3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->isLvalueCast());
3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
37251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
37271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
37321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
37391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getTypeAsWritten());
3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
37441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
37651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation FakeTypeLoc
3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
37731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
37811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
37901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
37971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
38091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
38111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
38171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
38231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRBraceLoc());
3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
38311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
38511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
38561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
3862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
38641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
38661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
3867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
38701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
38791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
39001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    ImplicitValueInitExpr *E) {
39015557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
39025557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
39035557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
39045557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
39111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
3920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
39211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
39381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
39691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
39841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
39921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
39971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
40101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
40181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
40351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
40441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
40451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
40691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
40701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
40741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
40811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCallExpr(E);
4083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
40911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
40941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
41071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
41101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
41171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExplicitTy,
4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
41281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
41341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
41411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                CXXReinterpretCastExpr *E) {
4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
41471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   CXXFunctionalCastExpr *E) {
4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
41581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
4170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
41711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
4176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExplicitTy,
4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
41841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
41871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
41911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
4193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
41951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
4204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
42051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
42071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
42141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
42241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXNullPtrLiteralExpr *E) {
42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
42391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
42471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
42531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
42601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
42671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
4271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (getDerived().AlwaysRebuild() &&
4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(Param);
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
42911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
4294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
4296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
4297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
43021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *Var
430343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Var)
4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
43081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Var == E->getVarDecl())
4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
43101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  /*FIXME:*/E->getStartLoc(),
4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  Var);
4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
43181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
434243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
43571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
43711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
43761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
43821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Operand.get() == E->getArgument())
43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4393a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
4394a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                CXXPseudoDestructorExpr *E) {
4395a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4396a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
4397a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4399a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
4400a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4401a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                E->getQualifierRange());
4402a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
4403a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
44041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4405a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  QualType DestroyedType;
4406a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  {
4407a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
4408a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    DestroyedType = getDerived().TransformType(E->getDestroyedType());
4409a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (DestroyedType.isNull())
4410a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
4411a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4413a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4414a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Base.get() == E->getBase() &&
4415a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Qualifier == E->getQualifier() &&
4416a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      DestroyedType == E->getDestroyedType())
4417a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.Owned(E->Retain());
44181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4419a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4420a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
4421a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
4422a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getDestroyedTypeLoc(),
4423a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     DestroyedType,
4424a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
4425a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getQualifierRange());
4426a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
44271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4428a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
4429a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
44311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              UnresolvedFunctionNameExpr *E) {
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // There is no transformation we can apply to an unresolved function name.
44331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
44381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
44401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
44521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
44631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    UnresolvedDeclRefExpr *E) {
4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
4465f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4466f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                                E->getQualifierRange());
4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
447181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
447281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
447381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
44741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!getDerived().AlwaysRebuild() &&
4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      NNS == E->getQualifier() &&
4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Name == E->getDeclName())
44781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getQualifierRange(),
4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   Name,
4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getLocation(),
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   /*FIXME:*/false);
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
44891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
4490fd2300e1ee0eab6c51862a92d3f3c72540b36b23Douglas Gregor  TemporaryBase Rebase(*this, E->getTemplateNameLoc(), DeclarationName());
4491fd2300e1ee0eab6c51862a92d3f3c72540b36b23Douglas Gregor
44921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformTemplateName(E->getTemplateName());
4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Template.isNull())
4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4497f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4498f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  if (E->getQualifier()) {
4499f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4500f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                                      E->getQualifierRange());
4501f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    if (!Qualifier)
4502f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor      return SemaRef.ExprError();
4503f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
4504f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor
4505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
4508833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                               TransArgs[I]))
4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // compare template arguments (yet).
45141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: It's possible that we'll find out now that the template name
4516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // actually refers to a type, in which case the caller is actually dealing
4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // with a functional cast. Give a reasonable error message!
4518f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(),
4519f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                            Template, E->getTemplateNameLoc(),
4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLAngleLoc(),
4521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.data(),
4522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.size(),
4523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRAngleLoc());
4524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
45281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
4529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                              getDerived().TransformDecl(E->getConstructor()));
4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
45431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
45491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
45591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
45661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to
45671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the
4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself
4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique.
4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
4581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
4582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
45831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new
45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the
4585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the
4586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression.
4587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
45901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                CXXExprWithTemporaries *E) {
4591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(
4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor           SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->shouldDestroyTemporaries()));
4598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
46031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXTemporaryObjectExpr *E) {
4604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                            getDerived().TransformDecl(E->getConstructor()));
4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
46181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
4619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
4627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
46341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
46391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
46531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                            CXXUnresolvedConstructExpr *E) {
4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
4656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
46781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
46921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXUnresolvedMemberExpr *E) {
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46986cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Start the member reference and compute the object's type.
4699a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  Sema::TypeTy *ObjectType = 0;
47001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4701a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              E->getOperatorLoc(),
4702a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
4703a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              ObjectType);
4704a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (Base.isInvalid())
4705a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    return SemaRef.ExprError();
47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47076cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
47086cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
4709c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
47106cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
47116cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
47126cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
47131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4714a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4715a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
4716a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4717a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
4718c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                      QualType::getFromOpaquePtr(ObjectType),
4719c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope);
4720a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
4721a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
4722a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
47231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
4725dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4726dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                       QualType::getFromOpaquePtr(ObjectType));
472781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
472881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
47291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (!E->hasExplicitTemplateArgumentList()) {
47313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
47323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
47333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
47343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Base.get() == E->getBase() &&
47353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
47363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
47373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
47381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
47413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
47423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
47433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
47443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
47453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
47463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
47473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       FirstQualifierInScope);
47483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
47493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
47503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This is an ugly hack, which forces the same template name to
47513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // be looked up multiple times. Yuck!
47523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This also won't work for, e.g., x->template operator+<int>
47533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName OrigTemplateName
47543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo());
47551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
47571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = getDerived().TransformTemplateName(OrigTemplateName,
47583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                       QualType::getFromOpaquePtr(ObjectType));
47593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (Template.isNull())
47603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.ExprError();
47611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4762833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
47633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4764833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
4765833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                               TransArgs[I]))
47663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
47673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
47681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
4772a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
4773a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
47743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     Template,
4775c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     E->getMemberLoc(),
47763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
47773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     E->getLAngleLoc(),
47783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     TransArgs.data(),
47793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     TransArgs.size(),
47803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     E->getRAngleLoc());
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
47851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
47861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
47911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
48001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
48091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
48121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
48171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
48231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
48241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ObjCProtocolDecl *Protocol
4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                getDerived().TransformDecl(E->getProtocol()));
4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
48321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
48391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
48441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
48471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
48551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
486009105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
48611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          ObjCImplicitSetterGetterRefExpr *E) {
4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
48641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
48691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
4870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
48721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
48771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
4878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
48801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
48851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
48991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
49001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
4904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
49071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
49081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
4909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
49111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
49151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
49161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
4917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
49191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
4923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
4924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
4925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
492785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
492885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
492985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
4930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
4931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
493485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
493585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
493685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
4938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
49411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
494285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
494385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
494485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
494585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
494685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
4947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
49501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
495185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
495285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
495385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
49540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
495585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
4956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4958577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
49591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
496085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType,
496185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     SourceLocation Sigil) {
496285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil,
4963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                  getDerived().getBaseEntity());
4964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
4965a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4966a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
4967a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
4968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
4970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
4971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
4972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
4973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
4974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
4975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
4976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
4977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
49781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
49801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
49811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
49821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
4983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
4984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
4985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
4986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
4987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
4988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
4989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
4990577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
49911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4992577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeType.isNull())
4993577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
49941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
49961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
4997577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
49981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
4999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
50001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
50021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
50031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
5004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
5005577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
500685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
500785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
50081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
500985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
5010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5012577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
50131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
50141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
5015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
501685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
501785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
50181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
501985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
5020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
50211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
50231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
50241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
5025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
5027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
5028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
50291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
50351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
50361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
5037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
5039577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
5040577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
50411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5045577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
5048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   unsigned NumElements) {
5049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
5050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getVectorType(ElementType, NumElements);
5051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
50521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
5055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
5056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
5057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
5058577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
5059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
50601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
5061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
5062577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
5063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
5064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
50651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
50671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
50681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
5070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
5071577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
5072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
50731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
50761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
5077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
50781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
5079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
5081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
5082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
5083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
5084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
50851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
5088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
5089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
5093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
5094577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5095577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5096577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5097577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
5098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
5099577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
5103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
5104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
5108833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
5109833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
5110833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   SourceLocation LAngleLoc,
5111833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                            const TemplateArgumentLoc *Args,
5112833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                           unsigned NumArgs,
5113833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   SourceLocation RAngleLoc) {
5114833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, LAngleLoc,
5115833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                     Args, NumArgs, RAngleLoc);
5116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
51171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5118dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5119dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5120dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5121dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5122a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
5123c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
5124c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
5125dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
5126dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
5127dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
5128dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
5129dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
51301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
5131495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
5132c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
5133c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
5134495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        false));
5135dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5136dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5137dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5138dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5139dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5140dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5141dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
5142dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5143dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5144dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5145dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5146dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5147dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5148dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5149dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
5150dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   QualType T) {
5151dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (T->isDependentType() || T->isRecordType() ||
5152dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
51530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    assert(!T.hasQualifiers() && "Can't get cv-qualifiers here");
5154dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5155dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
5156dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
51571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5158dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5159dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
5160dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
51611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5162d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
51631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5164d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5165d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
5166d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
5168d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
5169d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
5170d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
5171d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
51721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5173d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5174d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
5175d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            OverloadedFunctionDecl *Ovl) {
5176d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
5177d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
5178d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
5179d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
51801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5181d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
51823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
51833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
5184d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
5185d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
51861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
51873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
51883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
51893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              II,
51903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
51913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
51923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              ObjectType.getAsOpaquePtr())
51933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
5194d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
51951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
51971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
5200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
5201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
5202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
5205f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  DeclRefExpr *DRE
5206f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
5207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
52081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
5210f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
5211f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    if (!FirstExpr->getType()->isOverloadableType() &&
5212f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl        !SecondExpr->getType()->isOverloadableType())
5213f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
5214f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       DRE->getLocStart(),
5215f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       move(Second), OpLoc);
5216f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  } else if (SecondExpr == 0 || isPostIncDec) {
5217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
5218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
5219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
5221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
52221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
52261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
5227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
5228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
5229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
5230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
5232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
5234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
52351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
5237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
5238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
5239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
5243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
5244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::FunctionSet Functions;
52451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we have to check
5247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // IsAcceptableNonMemberOperatorCandidate for each of these?
52488f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor  for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
5249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Functions.insert(*F);
52501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
5252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
5253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
52541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName OpName
5255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
5256644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl  SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs,
5257644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl                                  Functions);
52581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
5260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
52611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
5262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5266f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
5267f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    return SemaRef.CreateOverloadedArraySubscriptExpr(DRE->getLocStart(), OpLoc,
5268f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                      move(First),move(Second));
5269f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
5270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
52711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
5272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
52731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
5274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
5276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
5279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
52801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
5281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
5284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
5286