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