TreeTransform.h revision a2813cec2605ce7878d1b13471d685f689b251af
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.
293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg);
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
300dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  QualType
301dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
302dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
303dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
30443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
30743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Transform##Node(Node *E);
310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent)
311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildPointerType(QualType PointeeType);
318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildBlockPointerType(QualType PointeeType);
324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new lvalue reference type given the type it references.
326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the lvalue reference
328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildLValueReferenceType(QualType ReferentType);
330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new rvalue reference type given the type it references.
332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the rvalue reference
334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRValueReferenceType(QualType ReferentType);
3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType);
3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new Objective C object pointer type.
345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildObjCObjectPointerType(QualType PointeeType);
346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals);
370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      unsigned IndexTypeQuals);
379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4527da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4537da2431c23ef1ee8acb114e39692246e1801afc2John McCall  /// \brief Build a new elaborated type.
4547da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
4557da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return SemaRef.Context.getElaboratedType(T, Tag);
4567da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
4741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             const TemplateArgument *Args,
482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             unsigned NumArgs);
4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
4861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, builds a new QualifiedNameType type from the
4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// nested-name-specifier and the named type. Subclasses may override
488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
4911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypenameType type from the nested-name-specifier
4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and the given type. Subclasses may override this routine to provide
497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NNS->isDependent())
5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Context.getTypenameType(NNS,
501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// (or qualified name type). Subclasses may override this routine to provide
510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                               const IdentifierInfo *Id) {
513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.CheckTypenameType(NNS, *Id,
514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  SourceRange(getDerived().getBaseLocation()));
515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
517dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
518dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
519dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
520dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
521dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
522dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
523dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
524dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
525a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
526c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
527c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
528dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
529dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
530dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
533dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
534dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
535dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
536dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
537dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
538dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
539dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
540dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
541dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
542dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
543dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  QualType T);
549d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
550d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
551d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
552d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
553d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
554d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
555d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
556d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
557d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
558d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
559d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
560d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
561d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and a set of
562d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// overloaded function templates.
563d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
564d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
565d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
566d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
567d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
568d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   OverloadedFunctionDecl *Ovl);
5691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
570d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
571d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
572d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
573d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
574d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
575d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
576d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
5783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
5793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
5801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
58343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
58443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
58543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
58643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
58743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
58843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
58943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
59043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
59143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
59243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
59343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
59443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
59543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
59643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
59743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
59843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
59943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
60043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
60143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
60243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
6031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
60443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
60543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
60843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default 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.
6201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
6231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 StmtArg Then, SourceLocation ElseLoc,
64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 StmtArg Else) {
64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else));
64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) {
65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnStartOfSwitchStmt(move(Cond));
65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
66943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    Sema::FullExprArg Cond,
67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body));
67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  StmtArg Init, ExprArg Cond, ExprArg Inc,
69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond),
69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  move(Inc), RParenLoc, move(Body));
69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
7361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                DeclaratorInfo *Declarator,
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
7661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
784a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
785a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
786a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      NamedDecl *ND, SourceLocation Loc) {
787a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
788a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
789a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildDeclarationNameExpr(Loc, ND,
791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false,
792a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                              &SS,
793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false);
794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
7951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
805a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
807a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
808a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
809a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
810a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
811a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
812a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              SourceLocation DestroyedTypeLoc,
813a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  QualType DestroyedType,
814a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                               NestedNameSpecifier *Qualifier,
815a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceRange QualifierRange) {
816a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CXXScopeSpec SS;
817a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (Qualifier) {
818a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setRange(QualifierRange);
819a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setScopeRep(Qualifier);
820a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    }
821a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
8221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    DeclarationName Name
823a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      = SemaRef.Context.DeclarationNames.getCXXDestructorName(
824a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                               SemaRef.Context.getCanonicalType(DestroyedType));
8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
827a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              OperatorLoc,
828a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              isArrow? tok::arrow : tok::period,
829a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              DestroyedTypeLoc,
830a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Name,
831a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Sema::DeclPtrTy::make((Decl *)0),
832a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              &SS);
8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
8541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
8661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
8751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
8851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
8971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
90283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
90383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
90483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     NamedDecl *Member) {
906d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
907d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
908d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
911d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson        new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
912d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
913d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
914d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
915d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
9161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
91783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
91883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
91983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
92083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
92183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
92283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
923017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              isArrow? tok::arrow : tok::period,
925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              MemberLoc,
926017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                              Member->getDeclName(),
92783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
92883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                              &SS);
929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
9391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     (Expr *)RHS.get());
941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    LHS.release();
945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    RHS.release();
946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
9501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new implicit cast expression.
9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new implicit cast without any semantic analysis.
965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr, bool isLvalue) {
968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ImplicitCastExpr *ICE
9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      = new (getSema().Context) ImplicitCastExpr(T, Kind,
970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 (Expr *)SubExpr.release(),
971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 isLvalue);
972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(ICE);
973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
9761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType ExplicitTy,
981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCastExpr(/*Scope=*/0,
984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   LParenLoc,
985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   ExplicitTy.getAsOpaquePtr(),
986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc,
987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(SubExpr));
988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T,
996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          RParenLoc, move(Init));
1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              tok::period, AccessorLoc,
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Accessor,
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RBraceLoc) {
1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
10271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
10461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
10551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
10651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
10751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
10761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
10861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
11331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
11501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
11561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
11661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
11671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
11691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
11741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            QualType T,
1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
11901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             QualType T,
1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
12061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
12381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                QualType T,
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
125188650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
125588650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
12681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
12801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
12851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
12881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
12891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
12931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      QualType ThisType) {
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
1315f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
13271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
13281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ conditional declaration expression.
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation EqLoc,
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               VarDecl *Var) {
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    EqLoc,
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    Var));
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" 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.
13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
13611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait 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.
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                bool IsAddressOfOperand) {
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Location,
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Name,
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*Trailing lparen=*/false,
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              &SS,
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              IsAddressOfOperand);
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1425f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier,
1426f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                         SourceRange QualifierRange,
1427f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                         TemplateName Template,
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation TemplateLoc,
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LAngleLoc,
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgument *TemplateArgs,
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         unsigned NumTemplateArgs,
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RAngleLoc) {
1433f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange,
1434f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                         Template, TemplateLoc,
1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         LAngleLoc,
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgs, NumTemplateArgs,
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         RAngleLoc);
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
1448ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson    return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1449ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           SourceLocation(),
1450ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           T, Constructor, IsElidable,
1451f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson                                           move(Args));
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference 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.
14950dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1498a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1499a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1501c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1502c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
15030dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor    OwningExprResult Base = move(BaseE);
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1505a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1507a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1508a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
15091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(Base), OperatorLoc, OpKind,
1512017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            MemberLoc,
1513017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            Name,
1514a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                    /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
1515c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            &SS,
1516c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            FirstQualifierInScope);
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
15193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// \brief Build a new member reference expression with explicit template
15203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// arguments.
15213b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
15223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
15233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
15253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  bool IsArrow,
15263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation OperatorLoc,
15273b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                NestedNameSpecifier *Qualifier,
15283b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceRange QualifierRange,
15293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  TemplateName Template,
15303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                SourceLocation TemplateNameLoc,
15313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NamedDecl *FirstQualifierInScope,
15323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation LAngleLoc,
15333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                          const TemplateArgument *TemplateArgs,
15343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  unsigned NumTemplateArgs,
15353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation RAngleLoc) {
15363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OwningExprResult Base = move(BaseE);
15373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
15403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
15413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // FIXME: We're going to end up looking up the template based on its name,
15443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr.
15453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    DeclarationName Name;
15463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
15473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = ActualTemplate->getDeclName();
15481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else if (OverloadedFunctionDecl *Ovl
15493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor               = Template.getAsOverloadedFunctionDecl())
15503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Ovl->getDeclName();
15513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    else
15523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Template.getAsDependentTemplateName()->getName();
15531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
15553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              OperatorLoc, OpKind,
15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              TemplateNameLoc, Name, true,
15573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              LAngleLoc, TemplateArgs,
15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NumTemplateArgs, RAngleLoc,
15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              Sema::DeclPtrTy(), &SS);
15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
15611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
15711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                             RParenLoc));
1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
15981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
16031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
16061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          BuiltinLoc, false, false);
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
16101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
16191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
16261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
163043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
163143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
163243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
163343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
163543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
163643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
163843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
163943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
164043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
164143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
164243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
16431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
164443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
164543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
164643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
164743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
164843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
164943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
165043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
165143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
16521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
165343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().Owned(E.takeAs<Stmt>());
165443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
16551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
16591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1661670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    bool isAddressOfOperand) {
1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
1670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
16731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1676657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1677657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1678657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1679dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1680dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1681a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1682c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1683c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
16840979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
16850979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1688dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1689dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1691c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1692c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
1693dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1694dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
16951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
1697c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
1698a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
1699c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
1700dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1702dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1703dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
17041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
1705a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
1706a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1707a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
1708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1711a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
1712c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
1713c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
17141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
17161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
1717dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
1718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                            getDerived().TransformDecl(NNS->getAsNamespace()));
17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1722dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1734dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1735d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1736d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1741dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   T);
1746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
17501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
1751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
17541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
175581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
1756dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 SourceLocation Loc,
1757dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 QualType ObjectType) {
175881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
175981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
176081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
176181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
176281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
176381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
176481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
176581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
176681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
176781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
176881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
17691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
177081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
177181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
177281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
177381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
1774dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    QualType T;
1775dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    if (!ObjectType.isNull() &&
1776dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1777dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      TemplateSpecializationType *SpecType
1778dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        = cast<TemplateSpecializationType>(Name.getCXXNameType());
1779dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = TransformTemplateSpecializationType(SpecType, ObjectType);
1780dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    } else
1781dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = getDerived().TransformType(Name.getCXXNameType());
178281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
178381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
17841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
178581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
17861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
179281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
179381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
179481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
17951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
17963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
17973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
1798d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
17991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1800d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1801d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1802d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1803d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1805d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
1807d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1808d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1809d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1811d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1812d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1813d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1814d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
18151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1816d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1817d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1818d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
18191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1820d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1821d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    assert(Ovl && "Not a template name or an overload set?");
18221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OverloadedFunctionDecl *TransOvl
1823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1824d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransOvl)
1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        NNS == QTN->getQualifier() &&
1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransOvl == Ovl)
1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1832d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TransOvl);
1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
18371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
18403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1844dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
1845dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType);
1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1865d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  assert(Ovl && "Not a template name or an overload set?");
18661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OverloadedFunctionDecl *TransOvl
1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!TransOvl)
1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName();
18701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      TransOvl == Ovl)
1873d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return Name;
18741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1875d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return TemplateName(TransOvl);
1876d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1877d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1878d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
18791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument
1880670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) {
1881670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1882670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
1883670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1884670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return Arg;
18851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1886670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1887670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    QualType T = getDerived().TransformType(Arg.getAsType());
1888670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (T.isNull())
1889670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1890670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(Arg.getLocation(), T);
1891670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
18921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1893670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1894670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1895670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (!D)
1896670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1897670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(Arg.getLocation(), D);
1898670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
18991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1900670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
1901670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
19021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
1903670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
19041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1905670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr());
1906670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (E.isInvalid())
1907670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1908670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(E.takeAs<Expr>());
1909670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1911670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
1912670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1913670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
19141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
1915670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
1916670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
1917670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      TemplateArgument TA = getDerived().TransformTemplateArgument(*A);
1918670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      if (TA.isNull())
1919670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor        return TA;
19201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1921670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      TransformedArgs.push_back(TA);
1922670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
1923670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
19241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
1925670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
1926670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return Result;
1927670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1928670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1930670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
1931670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  return TemplateArgument();
1932670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
1933670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
1935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
1936577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
1937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) {
1940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
1941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
19421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
1944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
1945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T);
19464802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
1947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
1948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DeclaratorInfo *NewDI = getDerived().TransformType(DI);
19491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
1951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
19521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
1954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1957a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallDeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) {
1958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
1959a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
19601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1961a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
19621bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
1963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
1964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
19651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1966a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, TL);
1967a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
1968a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
19691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1970a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TLB.getDeclaratorInfo(SemaRef.Context, Result);
1971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
1974a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
1975a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
1976a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
1977a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
1978a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
1979a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
1980a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
1981a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
1982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
1983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1984a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  llvm::llvm_unreachable("unhandled type loc!");
1985a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
1986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1988a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
1989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
1990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
1991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
1992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
19931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
19941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
1995a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
1996a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               QualifiedTypeLoc T) {
1997a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Qualifiers Quals = T.getType().getQualifiers();
1998a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
1999a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
2000a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2003a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2004a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2005a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2007a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
20081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Result = SemaRef.Context.getQualifiedType(Result, Quals);
2010a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2011a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.push<QualifiedTypeLoc>(Result);
2012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2013a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // No location information to preserve.
2014a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2015a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2016a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2017a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2018a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2019a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2020a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2021a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2022a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2023a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make
2026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work.
2027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \
2028a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType                                       \
2029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(TLB, TL.getPointeeLoc());   \
2030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (PointeeType.isNull())                                  \
2031a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();                                       \
2032a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();                            \
2034a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||                        \
2035a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != TL.getPointeeLoc().getType()) {         \
2036a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().Rebuild##TypeClass(PointeeType);   \
2037a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())                                     \
2038a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();                                     \
2039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }                                                          \
2040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result);    \
2042a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setSigilLoc(TL.getSigilLoc());                        \
2043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;                                             \
2045a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0)
2046a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Reference collapsing forces us to transform reference types
2048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// differently from the other pointer-like types.
2049a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformReferenceType(TypeClass) do { \
2050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType                                       \
2051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(TLB, TL.getPointeeLoc());   \
2052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (PointeeType.isNull())                                  \
2053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();                                       \
2054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();                            \
2056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||                        \
2057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != TL.getPointeeLoc().getType()) {         \
2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().Rebuild##TypeClass(PointeeType);   \
2059a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())                                     \
2060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();                                     \
2061a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }                                                          \
2062a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /* Workaround: rebuild doesn't always change the type */   \
2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /* FIXME: avoid losing this location information. */       \
2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result == PointeeType)                                 \
2066a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;                                           \
2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ReferenceTypeLoc NewTL;                                    \
2068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<LValueReferenceType>(Result))                      \
2069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);        \
2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else                                                       \
2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);        \
2072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());                       \
2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;                                             \
2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while (0)
2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      BuiltinTypeLoc T) {
2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
20821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
20831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB,
2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   FixedWidthIntTypeLoc T) {
2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
20881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ComplexTypeLoc T) {
2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
20951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      PointerTypeLoc TL) {
2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(PointerType);
2100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                  BlockPointerTypeLoc TL) {
2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(BlockPointerType);
2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 LValueReferenceTypeLoc TL) {
2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformReferenceType(LValueReferenceType);
2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 RValueReferenceTypeLoc TL) {
2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformReferenceType(RValueReferenceType);
2121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
21221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
21241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   MemberPointerTypeLoc TL) {
2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2137577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType);
2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ConstantArrayTypeLoc TL) {
2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers());
2170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2172a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2180a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2182a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
21871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              IncompleteArrayTypeLoc TL) {
2192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
2202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers());
2203a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2210a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2212a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2216a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2217a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2218a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   VariableArrayTypeLoc TL) {
2219a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2220a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2224670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2225670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2226670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2227a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2228a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2229a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2230577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2232a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2233a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2235a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2236a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2238a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2241a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
2242a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getBracketsRange());
2243a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2248a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2251a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
22521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2259a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             DependentSizedArrayTypeLoc TL) {
2260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2265670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2266670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
22671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2268a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                        T->getBracketsRange());
2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
22881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2294a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      DependentSizedExtVectorTypeLoc TL) {
2303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2310670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2311670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2312670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2319eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2320eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2332a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2343a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     VectorTypeLoc TL) {
2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements());
2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
23601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                        ExtVectorTypeLoc TL) {
2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
23841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
23881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   FunctionProtoTypeLoc TL) {
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ResultType.isNull())
2395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Transform the parameters.
2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<QualType, 4> ParamTypes;
2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
2407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo();
2408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      assert(OldDI->getType() == T->getArgType(i));
2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      DeclaratorInfo *NewDI = getDerived().TransformType(OldDI);
2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (!NewDI)
2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewDI == OldDI)
2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = OldParm;
2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      else
2417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = ParmVarDecl::Create(SemaRef.Context,
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getDeclContext(),
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getLocation(),
2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getIdentifier(),
2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI->getType(),
2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI,
2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getStorageClass(),
2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      /* DefArg */ NULL);
2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
24371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamTypes.push_back(NewType);
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamDecls.push_back(NewParm);
2440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
24411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getTypeQuals());
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
24541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 FunctionNoProtoTypeLoc TL) {
2468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypedefTypeLoc TL) {
2488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
2490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2495a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2496a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
25041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypeOfExprTypeLoc TL) {
2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprType *T = TL.getTypePtr();
2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2513670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
2514670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
25151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
25281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     TypeOfTypeLoc TL) {
2538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfType *T = TL.getTypePtr();
2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: should be an inner type, or at least have a DeclaratorInfo.
2541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Underlying.isNull())
2543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfType(Underlying);
2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
25521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       DecltypeTypeLoc TL) {
2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2564670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
2565670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
25661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2572a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
25821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     RecordTypeLoc TL) {
2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
2590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
2593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
2599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
26021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   EnumTypeLoc TL) {
2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
2613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
2616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26317da2431c23ef1ee8acb114e39692246e1801afc2John McCall
26327da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ElaboratedTypeLoc TL) {
2635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedType *T = TL.getTypePtr();
2636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this should be a nested type.
26387da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
26397da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
26407da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
26411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
26521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
26547da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
26551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TemplateTypeParmTypeLoc TL) {
2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
2662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
26641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
266549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
2666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         SubstTemplateTypeParmTypeLoc TL) {
2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
266949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
267049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
267149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
2672dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType
2673dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType(
2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TypeLocBuilder &TLB,
2675a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TemplateSpecializationTypeLoc TL) {
2676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: figure out how make this work with an ObjectType.
2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result
2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = TransformTemplateSpecializationType(TL.getTypePtr(), QualType());
2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TemplateSpecializationTypeLoc NewTL
2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = TLB.push<TemplateSpecializationTypeLoc>(Result);
2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2687dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
2688dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
2689dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
2690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2691dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                        const TemplateSpecializationType *T,
2692dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                          QualType ObjectType) {
26931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
2694dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
2695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
2696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs;
2699577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NewTemplateArgs.reserve(T->getNumArgs());
2700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
2701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor       Arg != ArgEnd; ++Arg) {
2702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg);
2703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewArg.isNull())
2704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
27051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    NewTemplateArgs.push_back(NewArg);
2707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
27081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: early abort if all of the template arguments and such are the
2710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // same.
27111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: We're missing the locations of the template name, '<', and '>'.
2713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTemplateSpecializationType(Template,
2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        NewTemplateArgs.data(),
2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        NewTemplateArgs.size());
2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   QualifiedNameTypeLoc TL) {
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameType *T = TL.getTypePtr();
2723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2725577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                SourceRange());
2726577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2727577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2729577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2730577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Named != T->getNamedType()) {
2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2746577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       TypenameTypeLoc TL) {
2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameType *T = TL.getTypePtr();
2752577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2753577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
27544a959d8788179d654df6b213b08d2b064989211dDouglas Gregor                        SourceRange(/*FIXME:*/getDerived().getBaseLocation()));
2755577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2756577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result;
2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2760577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
27611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType NewTemplateId
2762577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
2763577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
2764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
27651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2767577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
2768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
2769577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
27701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier());
2774577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2780577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2782577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ObjCInterfaceTypeLoc TL) {
278854e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCInterfaceType unimplemented");
278954e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
2790577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2794a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
2795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               ObjCObjectPointerTypeLoc TL) {
279654e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCObjectPointerType unimplemented");
279754e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
279824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
279924fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
2800577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
280143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
280243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
280343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
280443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
28051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
28061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
280743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
280843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
280943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
281043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
281143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
281243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
281343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
281443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
281543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
281643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
28171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
281843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
281943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
282043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
282143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
282243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
282343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
282443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
282543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
28261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
282743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
282843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
282943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
28301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
283143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
283243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
28331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
283443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
283543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
283643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
283743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
283843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
283943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
28401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
284143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
284243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
28431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
284443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // The case value expressions are not potentially evaluated.
284543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
28461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
284743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the left-hand case value.
284843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
284943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (LHS.isInvalid())
285043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
28511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
285243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the right-hand case value (for the GNU case-range extension).
285343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
285443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (RHS.isInvalid())
285543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
28561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
285743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
285843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
285943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
286043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
286143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
286243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
286343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
286443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
286543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
286643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
286843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
286943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
287043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
287143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
28721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
287343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
287443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
287543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
287643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
287743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
287843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
28791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
288043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
288143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
288243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
288343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
28841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
288543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
288643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
288743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
288843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
28891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
289043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
289143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
28921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
289343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
289443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
289543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
28961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
289743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
289843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
289943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
290043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
290143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
29021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
290343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
29041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
29051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
290643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
290743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
290843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
290943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
29121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
291443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
291543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
291643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
291943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
292043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
292143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
292343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
292443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
292543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
292643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
29271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
29281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
292943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
29301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
293143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
293243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
293343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
293443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
293643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
293743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
293843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
293943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
294143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
294243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
294343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
294443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
294643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
294743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
294843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
294943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
295143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
295243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
295343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
295443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
29551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
295643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
295743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
295943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
296143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
296243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
296443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
29651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
29741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
29751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
29781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
298943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
29911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
29951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
29961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
299943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
300043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
300243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
300343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
300543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
300643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
300743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
300843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
301143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
301243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
301343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
30301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
30311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     move(Init), move(Cond), move(Inc),
303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
30381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
30391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
30411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
304343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
304543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
304643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
304843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
30541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
305843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
306143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
30631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
306443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
306643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
306743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
30691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
307043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
307243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
307343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
307543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
307643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
307743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
30791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
308143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition(*D);
309243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
30941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
30971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
309943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
31001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
31021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
310643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
310943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
311143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
31121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
311343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
311443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
311543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
311643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
311743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
311843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement!
311943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Inline assembly cannot be transformed");
31201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
312143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
312243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
312443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
312543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
312743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
312843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @try statement");
31291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @catch statement");
313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
314443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @finally statement");
31451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
314943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
315143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
315243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @throw statement");
31531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
315443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
315643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
315743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
316043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @synchronized statement");
31621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
316543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
316743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
31681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
317043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C for-each statement");
31711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
317243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
317343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
317443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
317543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
317743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
317843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
318043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
318243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getDeclaratorInfo(),
319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
320043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
32021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
320343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
320843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
32101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
321143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
321243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
321343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
32141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
321543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
321643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
321743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
321843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
321943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
322143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
322243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
322343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
322443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
32251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
322643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
322743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
32381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
324143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
32421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
324343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
324443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
32461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
324743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
324843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
32491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
325043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
3253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
3254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
32551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
32561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
32571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
32581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
32591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
32601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
32621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
32631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
3264a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
3265a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
3266a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3267a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                       E->getQualifierRange());
3268a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
3269a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3270a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3271a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
32721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *ND
3273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
32761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3277a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3278a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
3279a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
3280a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      !E->hasExplicitTemplateArgumentList())
32811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
32821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3283a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // FIXME: We're losing the explicit template arguments in this transformation.
3284a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3285a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  llvm::SmallVector<TemplateArgument, 4> TransArgs;
3286a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3287a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    TemplateArgument TransArg
3288a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
3289a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (TransArg.isNull())
3290a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3291a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3292a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    TransArgs.push_back(TransArg);
3293a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3294a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3295a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // FIXME: Pass the qualifier/qualifier range along.
3296a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
3297a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                         ND, E->getLocation());
3298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
33031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
33111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
33151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
33171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
33231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
33271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
33291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
3333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
33361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
33381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
33391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
3341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
3342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
33441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
3347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
33501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
33521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
33531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
3356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
3357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
33581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
33611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
3362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
3363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getArgumentType());
3364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
33661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
3368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
33691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
3372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
3373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
33741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
33761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
3377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
3378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
3379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
3380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
33811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
3384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
33851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
33891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
3392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
3393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
33941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
34111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
3416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
3422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
3427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
3428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
34341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
3436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
34381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
34421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
3446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
34471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
3453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
346583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
34661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
346783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
346883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                                  E->getQualifierRange());
3469c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
347083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
347183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
34721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *Member
3474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
348083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Member == E->getMemberDecl())
34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
349083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
349183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
34931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        Member);
3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
34971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
34981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
35051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
3506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
35231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CompoundAssignOperator *E) {
3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformBinaryOperator(E);
3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
35321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
35501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
355247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
35531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
355447e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
35601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
35751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              move(SubExpr),
3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->isLvalueCast());
3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
35811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
35831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
35881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
3589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
35921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
35951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getTypeAsWritten());
3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
36081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
36211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation FakeTypeLoc
3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
36241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
36371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
36461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
36531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
36541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
36561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
36651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
36731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRBraceLoc());
3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
36871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
36891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
369043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
3691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
369543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
3700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
3703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
37121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
37151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
37201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
37221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
37261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
37301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
37351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
37381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
37471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
37561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    ImplicitValueInitExpr *E) {
3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
37631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
37731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
37811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
37901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
38041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
38211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
38361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
38441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
38491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
38531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
38621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
38701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
38871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
3891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
38961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
38971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
3915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
39211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
39221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
39261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
3928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
39331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCallExpr(E);
3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
39431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
39461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
39621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
39691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExplicitTy,
3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
3976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
39801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
39861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
39931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                CXXReinterpretCastExpr *E) {
3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
39991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   CXXFunctionalCastExpr *E) {
4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
40101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
40231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExplicitTy,
4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
40361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
40391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
40471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
40571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
40591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
40661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
40761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
40771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
40831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXNullPtrLiteralExpr *E) {
40841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
40911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
40991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
41051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
41121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
41191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
41201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (getDerived().AlwaysRebuild() &&
4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
41281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(Param);
4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
41431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *Var
415543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Var)
4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Var == E->getVarDecl())
4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
41621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  /*FIXME:*/E->getStartLoc(),
4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  Var);
4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
41701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
41891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
41931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
419443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
42001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
4207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
42091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
42231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
42281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Operand.get() == E->getArgument())
42351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4245a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
4246a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                CXXPseudoDestructorExpr *E) {
4247a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4248a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
4249a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4251a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
4252a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4253a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                E->getQualifierRange());
4254a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
4255a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
42561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4257a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  QualType DestroyedType;
4258a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  {
4259a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
4260a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    DestroyedType = getDerived().TransformType(E->getDestroyedType());
4261a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (DestroyedType.isNull())
4262a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
4263a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4265a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4266a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Base.get() == E->getBase() &&
4267a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Qualifier == E->getQualifier() &&
4268a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      DestroyedType == E->getDestroyedType())
4269a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.Owned(E->Retain());
42701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4271a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4272a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
4273a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
4274a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getDestroyedTypeLoc(),
4275a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     DestroyedType,
4276a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
4277a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getQualifierRange());
4278a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4280a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
4281a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              UnresolvedFunctionNameExpr *E) {
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // There is no transformation we can apply to an unresolved function name.
42851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
42901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
42921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
4294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
4303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
43041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
4310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
43151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    UnresolvedDeclRefExpr *E) {
4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
4317f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4318f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                                E->getQualifierRange());
4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
432381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
432481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
432581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
43261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!getDerived().AlwaysRebuild() &&
4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      NNS == E->getQualifier() &&
4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Name == E->getDeclName())
43301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getQualifierRange(),
4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   Name,
4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getLocation(),
4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   /*FIXME:*/false);
4337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
43411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
43421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformTemplateName(E->getTemplateName());
4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Template.isNull())
4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4347f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4348f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  if (E->getQualifier()) {
4349f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4350f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                                      E->getQualifierRange());
4351f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    if (!Qualifier)
4352f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor      return SemaRef.ExprError();
4353f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
4354f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor
4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<TemplateArgument, 4> TransArgs;
4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
43571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateArgument TransArg
4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isNull())
4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TransArgs.push_back(TransArg);
4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // compare template arguments (yet).
43671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: It's possible that we'll find out now that the template name
4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // actually refers to a type, in which case the caller is actually dealing
4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // with a functional cast. Give a reasonable error message!
4371f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(),
4372f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                            Template, E->getTemplateNameLoc(),
4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLAngleLoc(),
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.data(),
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.size(),
4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRAngleLoc());
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
43811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                              getDerived().TransformDecl(E->getConstructor()));
4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to
44201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself
4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique.
4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
44361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new
44371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the
4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression.
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
44431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                CXXExprWithTemporaries *E) {
4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor           SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->shouldDestroyTemporaries()));
4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
44561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXTemporaryObjectExpr *E) {
4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                            getDerived().TransformDecl(E->getConstructor()));
4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
44711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
4491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
44921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
4497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
4500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
45061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                            CXXUnresolvedConstructExpr *E) {
4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
45211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
45271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
45311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
45451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXUnresolvedMemberExpr *E) {
4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Start the member reference and compute the object's type.
4552a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  Sema::TypeTy *ObjectType = 0;
45531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4554a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              E->getOperatorLoc(),
4555a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
4556a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              ObjectType);
4557a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (Base.isInvalid())
4558a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    return SemaRef.ExprError();
45591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45606cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
45616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
4562c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
45636cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
45646cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
45656cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
45661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4567a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4568a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
4569a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4570a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
4571c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                      QualType::getFromOpaquePtr(ObjectType),
4572c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope);
4573a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
4574a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
4575a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
45761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
4578dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4579dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                       QualType::getFromOpaquePtr(ObjectType));
458081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
458181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
45821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (!E->hasExplicitTemplateArgumentList()) {
45843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
45853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
45863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
45873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Base.get() == E->getBase() &&
45883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
45893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
45903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
45911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
45921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
45943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
45953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
45963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
45973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
45983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
45993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
46003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       FirstQualifierInScope);
46013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
46023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
46033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This is an ugly hack, which forces the same template name to
46043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // be looked up multiple times. Yuck!
46053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This also won't work for, e.g., x->template operator+<int>
46063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName OrigTemplateName
46073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo());
46081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
46101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = getDerived().TransformTemplateName(OrigTemplateName,
46113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                       QualType::getFromOpaquePtr(ObjectType));
46123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (Template.isNull())
46133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.ExprError();
46141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  llvm::SmallVector<TemplateArgument, 4> TransArgs;
46163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
46171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateArgument TransArg
46183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
46193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (TransArg.isNull())
46203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
46211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    TransArgs.push_back(TransArg);
46233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
46241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
4627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
4628a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
4629a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
46303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     Template,
4631c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     E->getMemberLoc(),
46323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
46333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     E->getLAngleLoc(),
46343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     TransArgs.data(),
46353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     TransArgs.size(),
46363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     E->getRAngleLoc());
4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
46411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
46421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
46451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
46461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
46471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
4649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
46561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
46651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
46681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
46711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
46721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
46731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
46741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
46771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
46781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
46791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
46801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ObjCProtocolDecl *Protocol
4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                getDerived().TransformDecl(E->getProtocol()));
4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
46951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
46981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
46991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
47001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
47031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
47111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
471609105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
47171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          ObjCImplicitSetterGetterRefExpr *E) {
4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
47201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
47251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
47281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
47331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
47361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
47411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
47551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
47641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
47671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
47721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
47751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
47840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(),
4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseLocation(),
4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
47910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(),
4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseLocation(),
4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
47971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
47990953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, true, Qualifiers(),
4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    getDerived().getBaseLocation(),
4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    getDerived().getBaseEntity());
4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
48041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
48051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
48070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, false, Qualifiers(),
4808577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    getDerived().getBaseLocation(),
4809577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    getDerived().getBaseEntity());
4810577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4811577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4812577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
48131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
4814577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          QualType ClassType) {
48150953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
4816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        getDerived().getBaseLocation(),
4817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        getDerived().getBaseEntity());
4818577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4819577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4820577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
48211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
4822a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType) {
4823a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(),
4824a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                  getDerived().getBaseLocation(),
4825a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                  getDerived().getBaseEntity());
4826a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
4827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4828a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
4829a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
4830577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
4832577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
4833577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
4834577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
4835577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
4836577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
4837577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
4838577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
4839577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
48401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
48421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
48431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
48441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
4845577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
4846577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
4847577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
4848577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
4849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
4850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
4851577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
4852577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
48531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeType.isNull())
4855577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
48561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4857577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
4859577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
48601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
4861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
48621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4863577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
48641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
48651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
4866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
4867577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
4868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals) {
48691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
4870577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        IndexTypeQuals, SourceRange());
4871577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4872577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4873577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
48741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
48751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
4876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals) {
48781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
4879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, SourceRange());
4880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
48811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
48831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
48841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
4885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
4887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
4888577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
48891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4890577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
4891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
4892577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4893577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
48951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
48961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
4897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
4899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
4900577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
49011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4902577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
4903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
4904577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4907577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
4908577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   unsigned NumElements) {
4909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
4910577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getVectorType(ElementType, NumElements);
4911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
49121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4914577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
4915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
4916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
4917577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
4918577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
4919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
49201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
4921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
4922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
4923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
4924577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
49251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
49271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
49281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
4929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
4930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
4931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
4932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
49331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
49361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
4937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
49381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
4939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
49401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
4941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
4942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
4943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
4944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
49451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
4948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
4949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
4950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
4952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
4953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
4954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
4958577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
4959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4960577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
4963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
4964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
4968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        TemplateName Template,
4969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const TemplateArgument *Args,
4970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                           unsigned NumArgs) {
4971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Missing source locations for the template name, <, >.
4972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(),
49731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     SourceLocation(), Args, NumArgs,
49741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     SourceLocation());
4975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
49761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4977dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
4978dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
4979dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4980dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
4981a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
4982c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
4983c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
4984dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
4985dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
4986dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
4987dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
4988dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
49891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
4990495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
4991c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
4992c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
4993495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        false));
4994dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
4995dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
4996dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
4997dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
4998dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4999dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5000dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
5001dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5002dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5003dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5004dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5005dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5006dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5007dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5008dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
5009dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   QualType T) {
5010dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (T->isDependentType() || T->isRecordType() ||
5011dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
50120953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    assert(!T.hasQualifiers() && "Can't get cv-qualifiers here");
5013dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5014dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
5015dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
50161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5017dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5018dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
5019dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
50201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5021d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
50221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5023d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5024d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
5025d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
50261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
5027d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
5028d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
5029d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
5030d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
50311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5032d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5033d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
5034d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            OverloadedFunctionDecl *Ovl) {
5035d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
5036d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
5037d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
5038d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
50391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5040d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
50413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
50423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
5043d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
5044d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
50451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
50463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
50473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
50483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              II,
50493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
50503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
50513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              ObjectType.getAsOpaquePtr())
50523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
5053d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
50541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
50561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
5059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
5060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
5061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
5062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
50651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
5067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SecondExpr == 0 || isPostIncDec) {
5068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
50711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
50731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
50771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
5079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
5081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
50821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
5085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
50861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
5090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::FunctionSet Functions;
50961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclRefExpr *DRE
50988f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor    = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
50991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we have to check
5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // IsAcceptableNonMemberOperatorCandidate for each of these?
51028f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor  for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
5103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Functions.insert(*F);
51041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
5106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
51081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName OpName
5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions);
51111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
51141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
5115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
51201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
5121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
51221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
5123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
51291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
5130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
5133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
5135