TreeTransform.h revision 3e518bda00d710754ca077cf9be8dd821e16a854
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"
17f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall#include "Lookup.h"
18dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
19c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
20657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
22b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
26a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h"
27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h"
28b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h"
29b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
30a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h"
31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
64670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
7143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningStmtResult OwningStmtResult;
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningExprResult OwningExprResult;
94b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::StmtArg StmtArg;
95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::ExprArg ExprArg;
96b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
9743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  typedef Sema::MultiStmtArg MultiStmtArg;
9899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  typedef Sema::DeclPtrTy DeclPtrTy;
9999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, returns no source-location information. Subclasses can
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  DeclarationName Entity) : Self(Self) {
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determine whether the given type \p T has already been
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// to short-circuit evaluation when it is known that a given type will
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by creating a
178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// DeclaratorInfo for it and delegating to the appropriate
179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// function.  This is expensive, but we don't mind, because
180a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// this method is deprecated anyway;  all users should be
181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// switched to storing DeclaratorInfos.
182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType TransformType(QualType T);
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transforms the given type-with-location into a new
187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type-with-location.
188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ///
189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by delegating to the
190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// appropriate TransformXXXType to build a new type.  Subclasses
191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// may override this function (to take over all type
192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// transformations) or some set of the TransformXXXType functions
193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// to alter the transformation.
194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DeclaratorInfo *TransformType(DeclaratorInfo *DI);
195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
199577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
202657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
20543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
20643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
20743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
20843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
20943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
21043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
213657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
214657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E) {
222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Transform the given expression.
226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
239dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
240dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  Decl *TransformDecl(Decl *D) { return D; }
24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
24243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
24543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
24643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); }
2471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// This specific declaration transformation only applies to the first
2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    return cast_or_null<NamedDecl>(getDerived().TransformDecl(D));
2596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
2606cd219879ffce00920189ec1dcea927a42602961Douglas Gregor
261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
264dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
265dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
267a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
268c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
269c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
27681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
27781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName TransformDeclarationName(DeclarationName Name,
278dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           SourceLocation Loc,
279dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           QualType ObjectType = QualType());
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
285d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
293670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
294670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a DeclaratorInfo for a type.
305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  DeclaratorInfo *InventDeclaratorInfo(QualType T) {
306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return SemaRef.Context.getTrivialDeclaratorInfo(T,
307833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
308833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
31685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
317dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  QualType
318dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
319dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType
322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TransformTemplateSpecializationType(TypeLocBuilder &TLB,
323833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      TemplateSpecializationTypeLoc TL,
324833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      QualType ObjectType);
325dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
32643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
32943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
331c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  OwningExprResult Transform##Node(Node *E, bool isAddressOfOperand);
332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent)
333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
3341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
33985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
34585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
34785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
34985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
35085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
35185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
35585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
35685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
35785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new Objective C object pointer type.
36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildObjCObjectPointerType(QualType PointeeType,
36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        SourceLocation Sigil);
370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
39385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
39485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
40385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
40485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4787da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4797da2431c23ef1ee8acb114e39692246e1801afc2John McCall  /// \brief Build a new elaborated type.
4807da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
4817da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return SemaRef.Context.getElaboratedType(T, Tag);
4827da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
508d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &Args);
5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
5121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, builds a new QualifiedNameType type from the
5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// nested-name-specifier and the named type. Subclasses may override
514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
5171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypenameType type from the nested-name-specifier
5221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and the given type. Subclasses may override this routine to provide
523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NNS->isDependent())
5261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Context.getTypenameType(NNS,
527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
5351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// (or qualified name type). Subclasses may override this routine to provide
536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
5371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
538833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                               const IdentifierInfo *Id,
539833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                               SourceRange SR) {
540833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return SemaRef.CheckTypenameType(NNS, *Id, SR);
541dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
5421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
543dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
549dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
550dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
551a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
552c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
553c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
554dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
556dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
557dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
558dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
559dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
562dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
574dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  QualType T);
575d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
576d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
578d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
579d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
580d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
581d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
582d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
583d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
584d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
586d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
587d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
588d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
589d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
590d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
591d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
592d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
593d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
5943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
5953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
597ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
598ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
599ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
600ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
601ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
602ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
603ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
604ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
605ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
606ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
607ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
60843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
66999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 VarDecl *CondVar, StmtArg Then,
67099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 SourceLocation ElseLoc, StmtArg Else) {
67199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar),
67299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 move(Then), ElseLoc, move(Else));
67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
67999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningStmtResult RebuildSwitchStmtStart(Sema::FullExprArg Cond,
68099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                          VarDecl *CondVar) {
68199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnStartOfSwitchStmt(Cond, DeclPtrTy::make(CondVar));
68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    Sema::FullExprArg Cond,
70099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
70299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond, DeclPtrTy::make(CondVar),
70399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Body));
70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
7151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
72599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  StmtArg Init, Sema::FullExprArg Cond,
72699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
72899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond,
72999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  DeclPtrTy::make(CondVar),
73099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  Inc, RParenLoc, move(Body));
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
7591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
7681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                DeclaratorInfo *Declarator,
78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
80043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
80343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
816f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
817f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              LookupResult &R,
818f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              bool RequiresADL) {
819f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
820f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
821f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
822f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
823f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
824f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
825f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
826f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
827a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
828a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
829c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                      NamedDecl *ND, SourceLocation Loc,
830c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                      bool isAddressOfOperand) {
831a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
832a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
833a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildDeclarationNameExpr(Loc, ND,
835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false,
836a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                              &SS,
837c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                              isAddressOfOperand);
838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
849a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
852a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
853a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              SourceLocation DestroyedTypeLoc,
857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  QualType DestroyedType,
858a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                               NestedNameSpecifier *Qualifier,
859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceRange QualifierRange) {
860a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CXXScopeSpec SS;
861a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (Qualifier) {
862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setRange(QualifierRange);
863a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setScopeRep(Qualifier);
864a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    }
865a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
8661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    DeclarationName Name
867a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      = SemaRef.Context.DeclarationNames.getCXXDestructorName(
868a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                               SemaRef.Context.getCanonicalType(DestroyedType));
8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
871a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              OperatorLoc,
872a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              isArrow? tok::arrow : tok::period,
873a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              DestroyedTypeLoc,
874a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Name,
875a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Sema::DeclPtrTy::make((Decl *)0),
876a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              &SS);
8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
8866ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr));
887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
8935ab75172051a6d2ea71a80a79e81c65519fd3462John McCall  OwningExprResult RebuildSizeOfAlignOf(DeclaratorInfo *DInfo,
8945ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
8965ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getSema().CreateSizeOfAlignOfExpr(DInfo, OpLoc, isSizeOf, R);
897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
8991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
9171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
9251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
9421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
9461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
94783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
94883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
94983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
9508a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *Member,
951d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
9528a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
953d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
954d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
955d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
9561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
958d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson        new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
959d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
960d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
961d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
962d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
96483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
96583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
96683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
96783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
96883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
96983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
970017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              isArrow? tok::arrow : tok::period,
972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              MemberLoc,
973017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                              Member->getDeclName(),
9748a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                              ExplicitTemplateArgs,
97583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
9768a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                              &SS,
9778a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                              FirstQualifierInScope);
978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
9876ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc,
9886ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor                                LHS.takeAs<Expr>(), RHS.takeAs<Expr>());
989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
9921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
10001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new implicit cast expression.
10051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new implicit cast without any semantic analysis.
1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr, bool isLvalue) {
1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ImplicitCastExpr *ICE
10111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      = new (getSema().Context) ImplicitCastExpr(T, Kind,
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 (Expr *)SubExpr.release(),
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 isLvalue);
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(ICE);
1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
10181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType ExplicitTy,
1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCastExpr(/*Scope=*/0,
1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   LParenLoc,
1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   ExplicitTy.getAsOpaquePtr(),
1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc,
1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(SubExpr));
1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
10331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T,
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          RParenLoc, move(Init));
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
10451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
10522d1c21414199a7452f122598189363a3922605b1Douglas Gregor    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              tok::period, AccessorLoc,
10542d1c21414199a7452f122598189363a3922605b1Douglas Gregor                                              DeclarationName(&Accessor),
1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1064e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1065e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
1066e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    OwningExprResult Result
1067e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1068e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1069e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1070e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor
1071e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1072e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1073e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1074e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1075e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
11121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
11171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1123f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1124f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
11281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
11291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
11861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
11911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
12031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
12041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
12081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
12091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
12111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
12131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
12151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
12191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
12221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            QualType T,
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
12431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             QualType T,
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
12591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
12911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                QualType T,
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
130488650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
130888650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
13411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
13461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      QualType ThisType) {
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
1368f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
13791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
13811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
13941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
14371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
14411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1446865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1450f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1454f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1455f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
1456f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location,
1457f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1458f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1459f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location);
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1466f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1467f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1468f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1469d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1470f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
1481ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson    return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1482ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           SourceLocation(),
1483ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           T, Constructor, IsElidable,
1484f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson                                           move(Args));
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1528865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1531a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1532a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1534c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1535c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
15360dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor    OwningExprResult Base = move(BaseE);
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1538a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1540a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1541a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(Base), OperatorLoc, OpKind,
1545017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            MemberLoc,
1546017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            Name,
1547a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                    /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
1548c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            &SS,
1549c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            FirstQualifierInScope);
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
15523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// \brief Build a new member reference expression with explicit template
15533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// arguments.
15543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
15553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1557865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  bool IsArrow,
15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation OperatorLoc,
15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                NestedNameSpecifier *Qualifier,
15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceRange QualifierRange,
15623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  TemplateName Template,
15633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                SourceLocation TemplateNameLoc,
15643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NamedDecl *FirstQualifierInScope,
1565d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &TemplateArgs) {
15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OwningExprResult Base = move(BaseE);
15673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
15703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
15713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // FIXME: We're going to end up looking up the template based on its name,
15742d1c21414199a7452f122598189363a3922605b1Douglas Gregor    // twice! Also, duplicates part of Sema::BuildMemberAccessExpr.
15753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    DeclarationName Name;
15763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
15773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = ActualTemplate->getDeclName();
15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else if (OverloadedFunctionDecl *Ovl
15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor               = Template.getAsOverloadedFunctionDecl())
15803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Ovl->getDeclName();
1581ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    else {
1582ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      DependentTemplateName *DTN = Template.getAsDependentTemplateName();
1583ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      if (DTN->isIdentifier())
1584ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor        Name = DTN->getIdentifier();
1585ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      else
1586ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor        Name = SemaRef.Context.DeclarationNames.getCXXOperatorName(
1587ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                                          DTN->getOperator());
1588ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    }
1589d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
1590d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                            OperatorLoc, OpKind,
1591d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                            TemplateNameLoc, Name,
1592d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                            &TemplateArgs,
1593d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                            Sema::DeclPtrTy(), &SS);
15943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
15951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
16211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                             RParenLoc));
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
16321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
16420da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
16441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
16601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
166443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
166543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
166643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
166743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
16681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
167043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
167243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
167443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
167543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
16771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
167843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
167943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
168043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
168143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
168243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
168343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
168543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1687afe7ec28b1880335daba5f7310fe5191e14c4e76Douglas Gregor      return getSema().ActOnExprStmt(getSema().FullExpr(E));
168843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
16891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
169143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
169243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
16931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1695670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    bool isAddressOfOperand) {
1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1705c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E), \
1706c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                            isAddressOfOperand);
1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
17081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1711657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1712657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1713657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1716a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1717c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1718c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
17190979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
17200979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
17211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
172243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1723dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
17251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1726c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1727c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
17301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
1732c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
1733a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
1734c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1737dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
17391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
1740a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
1741a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1742a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
1743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1746a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
1747c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
1748c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                            getDerived().TransformDecl(NNS->getAsNamespace()));
17541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1763dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1765dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
17661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1767dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1769fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
1770dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1771d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1772d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
17731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1774dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1776dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
17801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1781dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   T);
1782dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1783dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1785dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
17861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
1787dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1788dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1789dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
17901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
1792dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 SourceLocation Loc,
1793dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 QualType ObjectType) {
179481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
179581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
179681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
179781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
179881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
179981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
180081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
180181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
180281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
18033e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
180481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
180581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
180781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
180881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
180981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
1811dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    QualType T;
1812dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    if (!ObjectType.isNull() &&
1813dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1814dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      TemplateSpecializationType *SpecType
1815dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        = cast<TemplateSpecializationType>(Name.getCXXNameType());
1816dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = TransformTemplateSpecializationType(SpecType, ObjectType);
1817dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    } else
1818dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = getDerived().TransformType(Name.getCXXNameType());
181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
182081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
18211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
182281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
18231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
182481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
182581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
18271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
182881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
182981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
183081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
183181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
18321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
18333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
18343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
1835d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
18361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1837d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
18471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1850d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
18561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1857f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
1858f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
18621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1863d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
18653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1869dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
1870dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1873ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
1874ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
1875ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
1876ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
1877ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
1878ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
1879d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
18821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
1883d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1884d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1885d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1887d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1888d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1889d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1891d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1892d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1894f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
1895f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
1896f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
1897d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1898d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1899d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
1900833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
1901833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
1902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
1904670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1905670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
1906833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    llvm::llvm_unreachable("null template argument in TreeTransform");
1907833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1909833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
1910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
1911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall               SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc));
1912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1915788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
1916788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
1917788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
1918788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
1924670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
1926828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
1927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1928833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
1929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1935833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
1936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
19411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1942670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DeclaratorInfo *DI = Input.getSourceDeclaratorInfo();
1944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      DI = InventDeclaratorInfo(Input.getArgument().getAsType());
1946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
1948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
1949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1952670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1954670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
1956972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
1957972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
1958972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
1959788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
1960670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
1962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1963828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
1964828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
1965828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
1966828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
1967828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
1968828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (E.isInvalid())
1969828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = NULL;
1970828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      else {
1971828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = E.takeAs<Expr>();
1972828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr->Retain();
1973828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      }
1974828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
1975828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
1976828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
1977833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1978670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1980788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
1981788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
1982788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
1983788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
1984788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
1985788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
1986788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1987788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
1988788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
1989788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
1990788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
1991788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
1992788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1993670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
1994670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
19951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
1996670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
19971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1998833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
1999833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2000833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2001833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
2002833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2003833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
2004833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2005833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *ETaken = E.takeAs<Expr>();
2006828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    ETaken->Retain();
2007833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2008833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2009670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2011670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2012670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2013670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
20141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2015670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2016670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
20171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2018833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2019833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2020833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2021828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2022828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2023828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2024828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2025833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2026833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2027828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2028670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2029670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
20301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2031670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2032828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2033833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2034670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2035670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2037670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2038833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2039670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2040670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2041577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2045577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) {
2047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T);
20534802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DeclaratorInfo *NewDI = getDerived().TransformType(DI);
20561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallDeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) {
2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2066a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
20671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
20691bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
20721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, TL);
2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
20761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TLB.getDeclaratorInfo(SemaRef.Context, Result);
2078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
2083a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2090577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  llvm::llvm_unreachable("unhandled type loc!");
2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               QualifiedTypeLoc T) {
2104a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
21151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Result = SemaRef.Context.getQualifiedType(Result, Quals);
2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.push<QualifiedTypeLoc>(Result);
2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // No location information to preserve.
2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make
2133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work.
2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \
2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType                                       \
2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(TLB, TL.getPointeeLoc());   \
2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (PointeeType.isNull())                                  \
2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();                                       \
2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();                            \
2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||                        \
2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != TL.getPointeeLoc().getType()) {         \
214385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().Rebuild##TypeClass(PointeeType,    \
214485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                          TL.getSigilLoc()); \
2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())                                     \
2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();                                     \
2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }                                                          \
2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result);    \
2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setSigilLoc(TL.getSigilLoc());                        \
2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;                                             \
2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0)
2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      BuiltinTypeLoc T) {
2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB,
2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   FixedWidthIntTypeLoc T) {
2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ComplexTypeLoc T) {
2171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2172a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2175a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2176a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      PointerTypeLoc TL) {
2178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(PointerType);
2179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                  BlockPointerTypeLoc TL) {
2185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(BlockPointerType);
2186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
218885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
218985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
219085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
219185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
219285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
219385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
219485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
219585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               ReferenceTypeLoc TL) {
219685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
219785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
219885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
219985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
220085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
220485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
220585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
220685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
220785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
220985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
221085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
221285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
221385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
221485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
221585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
221685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
221785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
221985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
222085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
222185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
222285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
222385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2224a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2225a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2226a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2227a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 LValueReferenceTypeLoc TL) {
222885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return TransformReferenceType(TLB, TL);
2229a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2231a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2232a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2233a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 RValueReferenceTypeLoc TL) {
223585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return TransformReferenceType(TLB, TL);
2236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
22391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2241a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   MemberPointerTypeLoc TL) {
2242a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2243a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2248a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
225885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
225985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
22701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ConstantArrayTypeLoc TL) {
2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
228585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
228685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
22941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              IncompleteArrayTypeLoc TL) {
2309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
231985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
232085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   VariableArrayTypeLoc TL) {
2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2342670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2343670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2344670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
236085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
23701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             DependentSizedArrayTypeLoc TL) {
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2383670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2384670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
23851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
240185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
24061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      DependentSizedExtVectorTypeLoc TL) {
2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2428670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2429670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2430670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2437eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2438eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     VectorTypeLoc TL) {
2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements());
2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
24781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                        ExtVectorTypeLoc TL) {
2485a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2495a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2496a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
25021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
25061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2508a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   FunctionProtoTypeLoc TL) {
2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ResultType.isNull())
2513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Transform the parameters.
2516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<QualType, 4> ParamTypes;
2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo();
2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      assert(OldDI->getType() == T->getArgType(i));
2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      DeclaratorInfo *NewDI = getDerived().TransformType(OldDI);
2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (!NewDI)
2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewDI == OldDI)
2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = OldParm;
2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      else
2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = ParmVarDecl::Create(SemaRef.Context,
2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getDeclContext(),
2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getLocation(),
2538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getIdentifier(),
2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI->getType(),
2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI,
2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getStorageClass(),
2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      /* DefArg */ NULL);
2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
25551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamTypes.push_back(NewType);
2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamDecls.push_back(NewParm);
2558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
25591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getTypeQuals());
2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
25721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 FunctionNoProtoTypeLoc TL) {
2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2590a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypedefTypeLoc TL) {
2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
2608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
26221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypeOfExprTypeLoc TL) {
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprType *T = TL.getTypePtr();
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2631670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
2632670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
26331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
26461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     TypeOfTypeLoc TL) {
2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfType *T = TL.getTypePtr();
2657a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: should be an inner type, or at least have a DeclaratorInfo.
2659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Underlying.isNull())
2661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2665a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfType(Underlying);
2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
26701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       DecltypeTypeLoc TL) {
2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2682670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
2683670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
26841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2687577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     RecordTypeLoc TL) {
2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
2708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
2711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2715a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
2716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
27201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2725577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   EnumTypeLoc TL) {
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
2731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2733577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
2734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2748577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27497da2431c23ef1ee8acb114e39692246e1801afc2John McCall
27507da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2752a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ElaboratedTypeLoc TL) {
2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedType *T = TL.getTypePtr();
2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this should be a nested type.
27567da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
27577da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
27587da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
27591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2762a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
27727da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
27731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2775577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2776577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TemplateTypeParmTypeLoc TL) {
2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
2780577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2781577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
27821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
278349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         SubstTemplateTypeParmTypeLoc TL) {
2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
278749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
278849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
278949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
2790dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType
2791dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType(
2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TypeLocBuilder &TLB,
2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TemplateSpecializationTypeLoc TL) {
2794833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(TLB, TL, QualType());
2795833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2796a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2797833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2798833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2799833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
2800833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2801833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
2802833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
2803a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2804833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
2805833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
2806833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2809828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
2810828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2811828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
2812828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
2813828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
2814833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2815833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
2816833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
2817833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
2818833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
2819833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
2822833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
2823dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
2824dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
2825dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
2826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2827833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
2828833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
2829833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2830833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
2831833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
28321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
2833dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
2834577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
2835577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2837d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
2838d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
2839d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
2840d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
2841d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
2842d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
2843d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
2844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2845d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
2846d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
28471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2848833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
2849833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2850833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
2851833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
2852833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
2853d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
28541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2855833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
2856833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
2857833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
2858833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
2859833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
2860833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
2861833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
2862833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
2863833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
28641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2865833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
2866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2869a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2870a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   QualifiedNameTypeLoc TL) {
2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameType *T = TL.getTypePtr();
2873577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2874577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2875577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                SourceRange());
2876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2881577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2883a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2884a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2885a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
2886a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Named != T->getNamedType()) {
2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2896577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       TypenameTypeLoc TL) {
2901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameType *T = TL.getTypePtr();
2902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /* FIXME: preserve source information better than this */
2904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceRange SR(TL.getNameLoc());
2905833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2907833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR);
2908577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
29101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2911a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result;
2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
29141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType NewTemplateId
2915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
2916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
2917577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
29181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2920577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
2921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
2922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
29231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2924a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
2925a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR);
2927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2929a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2930a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
2932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2939a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ObjCInterfaceTypeLoc TL) {
294154e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCInterfaceType unimplemented");
294254e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
2943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
2948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               ObjCObjectPointerTypeLoc TL) {
294954e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCObjectPointerType unimplemented");
295054e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
295124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
295224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
2953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
295443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
295543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
295643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
295743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
29591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
296143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
296243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
296343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
296443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
296543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
297443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
29791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
29831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
29861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
298943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
299243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
29931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
2997264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  OwningExprResult LHS(SemaRef), RHS(SemaRef);
2998264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
2999264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3000264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3002264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3003264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3004264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3005264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
30061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3007264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3008264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3009264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3010264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3011264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
30121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
301443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
301543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
302043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
303043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
303143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
303843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
304343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
305143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
305443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
30601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
30611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
30638cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  OwningExprResult Cond(SemaRef);
30648cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
30658cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
30668cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    ConditionVar
30678cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
30688cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
30698cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
30708cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
307199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
30728cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
30738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor
307499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
307599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
307699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
30778cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor
307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
30791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
308143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
309299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
30951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
30961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
309899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Then),
30991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
310043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
310143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
310243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
310343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
3106d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  OwningExprResult Cond(SemaRef);
3107d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3108d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3109d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    ConditionVar
3110d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3111d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
3112d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3113d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
311499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3115d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
311699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
311799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
311899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
311999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
31201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
312299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
312499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond,
312599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                                                ConditionVar);
312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
312743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
313143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
314243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
31435656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  OwningExprResult Cond(SemaRef);
31445656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
31455656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
31465656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    ConditionVar
31475656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
31485656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
31495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
31505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
315199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
31525656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
315399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
315499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
315599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
315699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
31571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
316043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
316243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
316543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
316799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
317199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar,
317299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                       move(Body));
317343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
317543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
317743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
317843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
318043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
320343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
320799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningExprResult Cond(SemaRef);
320899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
320999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
321099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    ConditionVar
321199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
321299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
321399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
321499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
321599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
321699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
321799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
321899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
321999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
322099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
32211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
322243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
322343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
322443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
322543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
322743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
323443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
32371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
32381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
324099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                     move(Init), getSema().FullExpr(Cond),
324199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                     ConditionVar,
324299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                     getSema().FullExpr(Inc),
324343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
324443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
32471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
32481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
32501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
325143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
325343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
325443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
325943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
326143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
326243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
32631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
326643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
326743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
32721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
327543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
32781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
328643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
329143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
329443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
330043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition(*D);
330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
33031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
33061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
33111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
331543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
331843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
332243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
332343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
332443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
332543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
332643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
332743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement!
332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Inline assembly cannot be transformed");
33291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @try statement");
33381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
334143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @catch statement");
334643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @finally statement");
33541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
335743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
336043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @throw statement");
33621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
336643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
33681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
337043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @synchronized statement");
33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
337443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
33771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C for-each statement");
33801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
338343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
33971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
339843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getDeclaratorInfo(),
340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
340243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
340343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
340643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
341043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
341443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
341743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
342243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
34341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
344143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
34431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
344443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
344643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
34471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
344943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
34551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
3463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
34641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3466c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E,
3467c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                bool isAddressOfOperand) {
34681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
34691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3473c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E,
3474c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                             bool isAddressOfOperand) {
3475a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
3476a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
3477a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3478a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                       E->getQualifierRange());
3479a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
3480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3481a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3482a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
34831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *ND
3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3488a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3489a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
3490a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
3491a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      !E->hasExplicitTemplateArgumentList())
34921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
34931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3494a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // FIXME: We're losing the explicit template arguments in this transformation.
3495a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3496833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
3497a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3498833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
3499833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                               TransArgs[I]))
3500a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3501a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3502a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3503a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  // FIXME: Pass the qualifier/qualifier range along.
3504a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
3505c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                         ND, E->getLocation(),
3506c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                         isAddressOfOperand);
3507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3511c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E,
3512c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                bool isAddressOfOperand) {
35131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3518c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E,
3519c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                 bool isAddressOfOperand) {
35201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3525c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E,
3526c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
35271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3532c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E,
3533c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                               bool isAddressOfOperand) {
35341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3539c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E,
3540c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3546c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformParenExpr(ParenExpr *E,
3547c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                           bool isAddressOfOperand) {
3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
35531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
3557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
35591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3561c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E,
3562c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                               bool isAddressOfOperand) {
3563c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr(),
3564c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                       E->getOpcode() == UnaryOperator::AddrOf);
3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
35691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3578c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E,
3579c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                   bool isAddressOfOperand) {
3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
35815ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    DeclaratorInfo *OldT = E->getArgumentTypeInfo();
35825557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
35835ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    DeclaratorInfo *NewT = getDerived().TransformType(OldT);
35845ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
35861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35875ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35905ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
35941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
35961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
36011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
3604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
36051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3617c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E,
3618c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                    bool isAddressOfOperand) {
3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
36321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3641c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E,
3642c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                          bool isAddressOfOperand) {
3643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
36561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
36601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
36711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3681c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E,
3682c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                            bool isAddressOfOperand) {
3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
368783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
368883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
36891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
369083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
369183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                                  E->getQualifierRange());
3692c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
369383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
369483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
36951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *Member
3697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
370383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
37048a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
37058a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      !E->hasExplicitTemplateArgumentList())
37061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3708d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
37098a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  if (E->hasExplicitTemplateArgumentList()) {
3710d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
3711d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
37128a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3713d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
3714d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
37158a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
3716d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
37178a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
37188a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
37198a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor
3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
372683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
372783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
37298a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
3730d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                        (E->hasExplicitTemplateArgumentList()
3731d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
37328a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        0);
3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3737c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCastExpr(CastExpr *E,
3738c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                          bool isAddressOfOperand) {
3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
37401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3745c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E,
3746c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                bool isAddressOfOperand) {
3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
37581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
37641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
3767c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      CompoundAssignOperator *E,
3768c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      bool isAddressOfOperand) {
3769c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  return getDerived().TransformBinaryOperator(E, isAddressOfOperand);
3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3774c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E,
3775c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
37931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
379547e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
37961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
379747e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
38021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3803c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E,
3804c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
38055557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
38065557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
38075557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have type information here? It seems like we won't,
38085557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // so do we even need to transform the type?
3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
38201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
38231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              move(SubExpr),
3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->isLvalueCast());
3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3829c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E,
3830c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
38321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3837c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E,
3838c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                bool isAddressOfOperand) {
3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
38421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
38451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getTypeAsWritten());
3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
38581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
3862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3867c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E,
3868c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
38721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation FakeTypeLoc
3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
38751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
38881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3897c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E,
3898c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      bool isAddressOfOperand) {
3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
39051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3917c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E,
3918c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                              bool isAddressOfOperand) {
3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
39201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
3928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
39321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3935e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3940c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E,
3941c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                    bool isAddressOfOperand) {
3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
39431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
394443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
394943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
39661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
39691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
39741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
39891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
39921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
40011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
4010c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     ImplicitValueInitExpr *E,
4011c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
40125557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
40135557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
40145557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
40155557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
40221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4029c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E,
4030c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                           bool isAddressOfOperand) {
4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
40331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
40501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4057c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E,
4058c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                               bool isAddressOfOperand) {
4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4082c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E,
4083c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                               bool isAddressOfOperand) {
4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4089c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult
4090c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E,
4091c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                          bool isAddressOfOperand) {
40921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
41001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4108c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E,
4109c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
41141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
41181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
4131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4135c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E,
4136c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                            bool isAddressOfOperand) {
4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
41531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4162c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E,
4163c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                             bool isAddressOfOperand) {
41641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4169c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E,
4170c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4175c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  OwningExprResult First
4176c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor    = getDerived().TransformExpr(E->getArg(0),
4177c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                           E->getNumArgs() == 1 && E->getOperator() == OO_Amp);
4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
41871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
41911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
41921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
41961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4203c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E,
4204c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                   bool isAddressOfOperand) {
4205c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  return getDerived().TransformCallExpr(E, isAddressOfOperand);
4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4210c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E,
4211c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
42151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
42181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
42411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExplicitTy,
4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
4247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4252c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E,
4253c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                   bool isAddressOfOperand) {
4254c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand);
4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4259c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E,
4260c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                    bool isAddressOfOperand) {
4261c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand);
4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
4267c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      CXXReinterpretCastExpr *E,
4268c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      bool isAddressOfOperand) {
4269c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand);
4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4274c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E,
4275c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
4276c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand);
4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
4282c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     CXXFunctionalCastExpr *E,
4283c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
42871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
4303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExplicitTy,
4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4313c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E,
4314c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                               bool isAddressOfOperand) {
4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
43171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
43251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
43351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
43441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
43531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4354c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E,
4355c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                    bool isAddressOfOperand) {
43561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
4362c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     CXXNullPtrLiteralExpr *E,
4363c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
43641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4369c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E,
4370c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                             bool isAddressOfOperand) {
4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
43721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4386c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E,
4387c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                              bool isAddressOfOperand) {
4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
43941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4401c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E,
4402c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                   bool isAddressOfOperand) {
44031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (getDerived().AlwaysRebuild() &&
4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(Param);
4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4417c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E,
4418c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      bool isAddressOfOperand) {
4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
44271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4437c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E,
4438c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                            bool isAddressOfOperand) {
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
446243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
44771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4496c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E,
4497c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                               bool isAddressOfOperand) {
4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
4500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
45031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Operand.get() == E->getArgument())
45041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4514a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
4515c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     CXXPseudoDestructorExpr *E,
4516c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
4517a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4518a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
4519a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
45201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4521a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
4522a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4523a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                E->getQualifierRange());
4524a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
4525a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
45261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4527a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  QualType DestroyedType;
4528a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  {
4529a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
4530a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    DestroyedType = getDerived().TransformType(E->getDestroyedType());
4531a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (DestroyedType.isNull())
4532a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
4533a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
45341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4535a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4536a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Base.get() == E->getBase() &&
4537a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Qualifier == E->getQualifier() &&
4538a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      DestroyedType == E->getDestroyedType())
4539a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.Owned(E->Retain());
45401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4541a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4542a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
4543a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
4544a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getDestroyedTypeLoc(),
4545a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     DestroyedType,
4546a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
4547a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getQualifierRange());
4548a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
45491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4550a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
4551a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
4552ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
4553f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                  UnresolvedLookupExpr *Old,
4554c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
4555f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
4556f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4557f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
4558f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
4559f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4560f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
4561f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
4562f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
4563f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I));
4564f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!InstD)
4565f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4566f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4567f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
4568f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
4569f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
4570f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
4571f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
4572f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
4573f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
4574f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
4575f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4576f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
4577f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4578f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4579f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
4580f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
4581f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
4582f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4583f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
4584f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
4585f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
4586f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
4587f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
4588f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    Old->getQualifierRange());
4589f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
4590f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4591f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4592f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
4593f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
4594f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4595f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4596f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
4597f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
4598f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
4599f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4600f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
4601f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
4602f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
4603f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
4604f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
4605f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
4606f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4607f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
4608f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4609f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4610f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
4611f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4616c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E,
4617c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                    bool isAddressOfOperand) {
4618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
46191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
46271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
46311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
4634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4641865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
4642865d447ac6a4721ab58e898d014a21f2eff74b06John McCall                                                  DependentScopeDeclRefExpr *E,
4643c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
4645f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4646f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                                E->getQualifierRange());
4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
465181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
465281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
465381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
46541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
4656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
4657f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
4658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        Name == E->getDeclName())
4659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
46601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
4662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
4663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         Name, E->getLocation(),
4664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
4665f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
4666d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
4667d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
4668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4669d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
4670d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4672d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4675f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
4676f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
4677f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       Name, E->getLocation(),
4678f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4683c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E,
4684c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                              getDerived().TransformDecl(E->getConstructor()));
4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
46991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
4721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
47221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to
47231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the
4724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself
4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique.
4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4728c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E,
4729c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      bool isAddressOfOperand) {
4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
47401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new
47411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression.
4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
4747c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      CXXExprWithTemporaries *E,
4748c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      bool isAddressOfOperand) {
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor           SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->shouldDestroyTemporaries()));
4756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
4761c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      CXXTemporaryObjectExpr *E,
4762c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                      bool isAddressOfOperand) {
4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                            getDerived().TransformDecl(E->getConstructor()));
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
47981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
4812c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  CXXUnresolvedConstructExpr *E,
4813c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
48381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
4843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
4844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4851865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
4852865d447ac6a4721ab58e898d014a21f2eff74b06John McCall                                                     CXXDependentScopeMemberExpr *E,
4853c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
4854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
4855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Start the member reference and compute the object's type.
4860a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  Sema::TypeTy *ObjectType = 0;
48611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4862a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              E->getOperatorLoc(),
4863a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
4864a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              ObjectType);
4865a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (Base.isInvalid())
4866a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    return SemaRef.ExprError();
48671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48686cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
48696cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
4870c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
48716cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
48726cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
48736cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
48741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4875a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4876a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
4877a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4878a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
4879c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                      QualType::getFromOpaquePtr(ObjectType),
4880c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope);
4881a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
4882a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
4883a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
48841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
4886dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4887dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                       QualType::getFromOpaquePtr(ObjectType));
488881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
488981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
48901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (!E->hasExplicitTemplateArgumentList()) {
48923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
48933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
48943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
48953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Base.get() == E->getBase() &&
48963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
48973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
48983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
48991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
49001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4901865d447ac6a4721ab58e898d014a21f2eff74b06John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
49023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
49033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
49043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
49053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
49063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
49073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
49083b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       FirstQualifierInScope);
49093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
49103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
49113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This is an ugly hack, which forces the same template name to
49123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // be looked up multiple times. Yuck!
4913ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemporaryBase Rebase(*this, E->getMemberLoc(), DeclarationName());
4914ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName OrigTemplateName;
4915ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  if (const IdentifierInfo *II = Name.getAsIdentifierInfo())
4916ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    OrigTemplateName = SemaRef.Context.getDependentTemplateName(0, II);
4917ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  else
4918ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    OrigTemplateName
4919ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      = SemaRef.Context.getDependentTemplateName(0,
4920ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                               Name.getCXXOverloadedOperator());
49211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
49231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = getDerived().TransformTemplateName(OrigTemplateName,
49243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                       QualType::getFromOpaquePtr(ObjectType));
49253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (Template.isNull())
49263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.ExprError();
49271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4928d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
49293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4930d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
4931d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
49323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
4933d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
49343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
49351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4936865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
4938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
4939a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
4940a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
49413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     Template,
4942c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     E->getMemberLoc(),
49433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
4944d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                     TransArgs);
4945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4949c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E,
4950c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                   bool isAddressOfOperand) {
49511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
49551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4956c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E,
4957c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                bool isAddressOfOperand) {
4958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
4959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
4962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
49661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
4970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
4971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4975c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E,
4976c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                 bool isAddressOfOperand) {
4977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
49791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
49831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4984c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E,
4985c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
49861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
49891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
49901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4991c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E,
4992c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
49931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ObjCProtocolDecl *Protocol
4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                getDerived().TransformDecl(E->getProtocol()));
4996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
4997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
50011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
5006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
50081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5013c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E,
5014c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                 bool isAddressOfOperand) {
5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
50171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5022c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E,
5023c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
5024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
50261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
503109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
5032c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                          ObjCImplicitSetterGetterRefExpr *E,
5033c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                     bool isAddressOfOperand) {
5034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
50361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5041c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E,
5042c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                               bool isAddressOfOperand) {
5043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
50451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5050c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E,
5051c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                             bool isAddressOfOperand) {
5052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
50541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5059c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E,
5060c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                   bool isAddressOfOperand) {
5061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
5065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
5066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
50671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
50741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
5079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5083c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E,
5084c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                           bool isAddressOfOperand) {
5085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
50871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5092c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E,
5093c86a6e988184867b09aa17a619402d0e81d0fda0Douglas Gregor                                                  bool isAddressOfOperand) {
5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
50961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
510485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
510585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
510685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
5108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
511185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
511285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
511385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
5114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
5115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
511985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
512085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
512185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
512285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
512385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
5124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
512885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
512985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
513085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
51310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
513285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
5133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
51361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
513785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType,
513885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     SourceLocation Sigil) {
513985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil,
5140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                  getDerived().getBaseEntity());
5141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
5145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
5146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
5147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
5148577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
5149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
5150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
5151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
5152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
5153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
5154577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
51551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
51571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
51591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
5160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
5161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
5162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
5163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
5164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
5165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
5166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
5167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
51681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeType.isNull())
5170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
51711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
51731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
5174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
51751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
5176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
51771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
51791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
51801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
5181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
5182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
518385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
518485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
51851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
518685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
5187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
51901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
51911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
5192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
519385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
519485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
51951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
519685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
5197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
51981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5199577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
52001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
52011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
5202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
5204577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
5205577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
52061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5207577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5208577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
52121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
52131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
5214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
5216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
5217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
52181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5223577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
5225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   unsigned NumElements) {
5226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
5227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getVectorType(ElementType, NumElements);
5228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
52291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5230577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
5232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
5233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
5234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
5235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
5236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
52371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
5238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
5239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
5240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
5241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
52421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
52441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
52451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
5246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
5247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
5248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
5249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
52501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
52531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
5254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
52551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
5256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
52571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
5258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
5259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
5260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
5261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
52621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
5265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
5266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5268a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
5270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
5271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
5275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
5276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
5280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
5281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
5285833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
5286833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
5287d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
5288d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
5289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
52901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5291dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5292dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5293dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5294dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5295a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
5296c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
5297d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
5298dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
5299dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
5300dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
5301dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
5302dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
53031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
5304495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
5305c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
5306c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
5307495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        false));
5308dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5309dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5310dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5311dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5312dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5313dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5314dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
5315dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5316dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5317dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5318dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5319dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5320dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5321dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5322dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
5323dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   QualType T) {
5324dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (T->isDependentType() || T->isRecordType() ||
5325dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
5326a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
5327dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5328dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
5329dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
53301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5331dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5332dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
5333dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
53341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5335d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
53361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5337d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5338d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
5339d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
53401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
5341d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
5342d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
5343d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
5344d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
53451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5346d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
53473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
53483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
5349d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
5350d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
53511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
5352014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
5353014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
53543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
53553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
53563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
5357014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor                                              Name,
5358a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
5359a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
53603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
5361d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
53621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5364ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
5365ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5366ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
5367ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
5368ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
5369ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
5370ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
5371ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
5372ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
5373ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
5374ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
5375ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return getSema().ActOnDependentTemplateName(
5376ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
5377ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              SS,
5378ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              Name,
5379a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
5380a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
5381ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor           .template getAsVal<TemplateName>();
5382ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
5383ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5384ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
53851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
5388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
5389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
5390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
5391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
5392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
5393ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
5394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
53951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
5397f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
5398f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    if (!FirstExpr->getType()->isOverloadableType() &&
5399f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl        !SecondExpr->getType()->isOverloadableType())
5400f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
5401ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                 CalleeExpr->getLocStart(),
5402f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       move(Second), OpLoc);
54031a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
54041a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
54051a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
5406f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  } else if (SecondExpr == 0 || isPostIncDec) {
5407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
5408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
5409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
54101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
5411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
54121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
54161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
5417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
5418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
5419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
5420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
54211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
5422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
5424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
54251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
5427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
5428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
5429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
54311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
5433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
5434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::FunctionSet Functions;
54351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5436ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
5437ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
5438ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
5439ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
5440ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
5441ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(),
5442ba13543329afac4a0d01304ec2ec4924d99306a6John McCall           E = ULE->decls_end(); I != E; ++I)
5443ba13543329afac4a0d01304ec2ec4924d99306a6John McCall      Functions.insert(AnyFunctionDecl::getFromNamedDecl(*I));
5444ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
5445ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    Functions.insert(AnyFunctionDecl::getFromNamedDecl(
5446ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                        cast<DeclRefExpr>(CalleeExpr)->getDecl()));
5447ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
54481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
5450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
5451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
54521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName OpName
5453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
5454644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl  SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs,
5455644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl                                  Functions);
54561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
5458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
54591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
5460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
54631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5464f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
5465ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
5466ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
5467ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(First),
5468ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(Second));
5469f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
5470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
54711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
5472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
54731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
5474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
5476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
54771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
5479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
54801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
5481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
5484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
5486