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