TreeTransform.h revision 9d125033a9853f3b572a4c9e2f9e2d4e5e346973
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
1756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// \brief Determine whether the given call argument should be dropped, e.g.,
1766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// because it is a default argument.
1776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  ///
1786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// Subclasses can provide an alternative implementation of this routine to
1796eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// determine which kinds of call arguments get dropped. By default,
1806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// CXXDefaultArgument nodes are dropped (prior to transformation).
1816eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  bool DropCallArgument(Expr *E) {
1826eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    return E->isDefaultArgument();
1836eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  }
1846eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by creating a
188a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// TypeSourceInfo for it and delegating to the appropriate
189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// function.  This is expensive, but we don't mind, because
190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// this method is deprecated anyway;  all users should be
191a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// switched to storing TypeSourceInfos.
192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType TransformType(QualType T);
1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transforms the given type-with-location into a new
197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type-with-location.
198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ///
199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by delegating to the
200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// appropriate TransformXXXType to build a new type.  Subclasses
201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// may override this function (to take over all type
202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// transformations) or some set of the TransformXXXType functions
203a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// to alter the transformation.
204a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *TransformType(TypeSourceInfo *DI);
205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
210a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
212657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
21543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
21643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
21743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
21843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
21943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
22043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
223657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
224657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
231454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult TransformExpr(Expr *E);
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
236dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
237dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  Decl *TransformDecl(Decl *D) { return D; }
23943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
24043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
24443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); }
2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2466cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
2476cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
2486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// This specific declaration transformation only applies to the first
2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    return cast_or_null<NamedDecl>(getDerived().TransformDecl(D));
2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor
259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
262dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
263dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
265a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
266c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
267c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
27081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
27181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName TransformDeclarationName(DeclarationName Name,
276dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           SourceLocation Loc,
277dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           QualType ObjectType = QualType());
2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
281d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
291670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
292670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
293833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
294833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
302a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// \brief Fakes up a TypeSourceInfo for a type.
303a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
304a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return SemaRef.Context.getTrivialTypeSourceInfo(T,
305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
31485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
315dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  QualType
316dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
317dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType
320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TransformTemplateSpecializationType(TypeLocBuilder &TLB,
321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      TemplateSpecializationTypeLoc TL,
322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      QualType ObjectType);
323dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
32443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
32743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
329454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult Transform##Node(Node *E);
330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent)
331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
33785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
34385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
34585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
34785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
34885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
34985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
35185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
35285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
35585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new Objective C object pointer type.
36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildObjCObjectPointerType(QualType PointeeType,
36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        SourceLocation Sigil);
368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
39185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
39285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
40185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
40285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
462ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// \brief Rebuild an unresolved typename type, given the decl that
463ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// the UnresolvedUsingTypenameDecl was transformed to.
464ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType RebuildUnresolvedUsingType(Decl *D);
465ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4807da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4817da2431c23ef1ee8acb114e39692246e1801afc2John McCall  /// \brief Build a new elaborated type.
4827da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
4837da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return SemaRef.Context.getElaboratedType(T, Tag);
4847da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
509833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
510d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &Args);
5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
5141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, builds a new QualifiedNameType type from the
5151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// nested-name-specifier and the named type. Subclasses may override
516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypenameType type from the nested-name-specifier
5241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and the given type. Subclasses may override this routine to provide
525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NNS->isDependent())
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Context.getTypenameType(NNS,
529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
5321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
5371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// (or qualified name type). Subclasses may override this routine to provide
538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
540833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                               const IdentifierInfo *Id,
541833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                               SourceRange SR) {
542833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return SemaRef.CheckTypenameType(NNS, *Id, SR);
543dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
5441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
545dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
546dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
548dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
549dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
550dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
551dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
552dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
553a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
554c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
555c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
556dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
557dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
558dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
559dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
562dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
574dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
575dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
576dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  QualType T);
577d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
578d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
579d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
580d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
581d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
582d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
583d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
584d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
586d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
587d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
588d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
589d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
590d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
591d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
592d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
593d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
594d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
595d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
5963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
5973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
5981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
599ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
600ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
601ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
602ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
603ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
604ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
605ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
606ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
607ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
608ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
609ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
6311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
6511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
66943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
67199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 VarDecl *CondVar, StmtArg Then,
67299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 SourceLocation ElseLoc, StmtArg Else) {
67399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar),
67499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 move(Then), ElseLoc, move(Else));
67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
68199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningStmtResult RebuildSwitchStmtStart(Sema::FullExprArg Cond,
68299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                          VarDecl *CondVar) {
68399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnStartOfSwitchStmt(Cond, DeclPtrTy::make(CondVar));
68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    Sema::FullExprArg Cond,
70299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
70499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond, DeclPtrTy::make(CondVar),
70599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Body));
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
7171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
72799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  StmtArg Init, Sema::FullExprArg Cond,
72899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
73099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond,
73199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  DeclPtrTy::make(CondVar),
73299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  Inc, RParenLoc, move(Body));
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
784a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
81143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
81243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
818f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
819f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              LookupResult &R,
820f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              bool RequiresADL) {
821f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
822f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
823f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
824f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
825f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
826f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
827f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
828f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
829a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
830a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
831dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      ValueDecl *VD, SourceLocation Loc,
832dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      TemplateArgumentListInfo *TemplateArgs) {
833a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
834a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
835a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
836dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
837dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
838dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
839dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return getSema().BuildDeclarationNameExpr(SS, Loc, VD);
840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
853a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
858a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              SourceLocation DestroyedTypeLoc,
859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  QualType DestroyedType,
860a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                               NestedNameSpecifier *Qualifier,
861a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceRange QualifierRange) {
862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CXXScopeSpec SS;
863a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (Qualifier) {
864a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setRange(QualifierRange);
865a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setScopeRep(Qualifier);
866a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    }
867a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
868aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
869aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    DeclarationName Name
871a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      = SemaRef.Context.DeclarationNames.getCXXDestructorName(
872a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                               SemaRef.Context.getCanonicalType(DestroyedType));
8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
874aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
875aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                              OperatorLoc, isArrow,
876129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FIXME: FirstQualifier*/ 0,
877129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              Name, DestroyedTypeLoc,
878129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /*TemplateArgs*/ 0);
8791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
8821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
8886ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr));
889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
8921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
895a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
8965ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
898a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
9131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
9271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
9441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
94983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
95083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
95183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
952f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                                     ValueDecl *Member,
953d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
9548a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
955d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
956d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
957d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
95983a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor      Expr *BaseExpr = Base.takeAs<Expr>();
96083a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor      if (getSema().PerformObjectMemberConversion(BaseExpr, Member))
96183a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        return getSema().ExprError();
9628aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
9631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
96483a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        new (getSema().Context) MemberExpr(BaseExpr, isArrow,
965d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
966d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
967d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
968d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
9691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
97083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
97183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
97283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
97383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
97483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
97583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
976aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
977aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
978c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    LookupResult R(getSema(), Member->getDeclName(), MemberLoc,
979c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                   Sema::LookupMemberName);
980c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.addDecl(Member);
981c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
982c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
983aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
984aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                              OpLoc, isArrow,
985129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
986c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
9966ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc,
9976ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor                                LHS.takeAs<Expr>(), RHS.takeAs<Expr>());
998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
10011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
10091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
10141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
10189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCastExpr(/*Scope=*/0,
1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   LParenLoc,
10239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                   TInfo->getType().getAsOpaquePtr(),
1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc,
1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(SubExpr));
1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T,
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          RParenLoc, move(Init));
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
10411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1048aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
1050aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
1051aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1052129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1053129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
10542d1c21414199a7452f122598189363a3922605b1Douglas Gregor                                              DeclarationName(&Accessor),
1055129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              AccessorLoc,
1056129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1065e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1066e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
1067e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    OwningExprResult Result
1068e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1069e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1070e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1071e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor
1072e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1073e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1074e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1075e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1076e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
10801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
10931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
11081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1124f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1125f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
11291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
11401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
11871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
11921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
11979d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
12049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
12051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
12099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
12101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
12149d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
12151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
12161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
12181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
12209d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
12211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
12231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
12281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
12389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
12449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       LAngleLoc,
12459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       TInfo->getType().getAsOpaquePtr(),
12469d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       RAngleLoc,
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
12569d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
12629d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       LAngleLoc,
12639d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       TInfo->getType().getAsOpaquePtr(),
12649d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       RAngleLoc,
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
12749d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
12809d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       LAngleLoc,
12819d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       TInfo->getType().getAsOpaquePtr(),
12829d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       RAngleLoc,
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
12929d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
12989d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       LAngleLoc,
12999d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       TInfo->getType().getAsOpaquePtr(),
13009d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                       RAngleLoc,
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
13099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                TypeSourceInfo *TInfo,
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
131388650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
13159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                               TInfo->getType().getAsOpaquePtr(),
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
131788650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
13181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
13471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
13511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
13551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
13571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1358828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1359828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1361828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1362828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1378036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1379036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1380036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1381036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
13921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
13931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
13941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
14071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
14151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
14501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
14541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1459865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1463f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1467f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1468f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
1469f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location,
1470f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1471f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1472f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location);
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1479f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1480f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1481f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1482d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1483f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
14914411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
14954411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
14964411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
14974411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
14984411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor      return getSema().ExprError();
14994411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor
15004411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
15014411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           move_arg(ConvertedArgs));
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1545865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
1546aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1549a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1550a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1551129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1553c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1554129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1556a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1557a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
15581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1559aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1560aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1561129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
1562129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            Name, MemberLoc, TemplateArgs);
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1565129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
15673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
15683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1569129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE,
1570aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1571129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1572129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1573129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1574129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1575c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1576129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1577129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
15783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
15803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1582aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1583aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1584c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1585c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
15863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
15971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
16131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                             RParenLoc));
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
16291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
16321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
16340da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
16361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
16451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
16501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
16521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
165643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
165943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
16601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
166243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
16631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
166543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
166643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
166743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
16691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
167043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
167143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
167243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
167443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
167543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
16781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16795ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E));
168043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
16811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
16851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1687670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1688454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1696454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
16981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1701657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1702657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1703657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1704dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1706a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1707c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1708c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
17090979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
17100979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
17111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
171243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1713dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
17151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1716c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1717c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
1718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
17201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
1722c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
1723a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
1724c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
1725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
17291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
1730a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
1731a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1732a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1736a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
1737c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
1738c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
17391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
1742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
1743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                            getDerived().TransformDecl(NNS->getAsNamespace()));
17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1754dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
17561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1758dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1759fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1761d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1762d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1765dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1766dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1767dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
17701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1771dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   T);
1772dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1773dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
17761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1778dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1779dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
17801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
178181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
1782dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 SourceLocation Loc,
1783dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 QualType ObjectType) {
178481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
178581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
178681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
178981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
179081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
179281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
17933e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
179481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
179581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
17961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
179781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
179881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
179981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
180081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
1801dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    QualType T;
1802dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    if (!ObjectType.isNull() &&
1803dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1804dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      TemplateSpecializationType *SpecType
1805dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        = cast<TemplateSpecializationType>(Name.getCXXNameType());
1806dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = TransformTemplateSpecializationType(SpecType, ObjectType);
1807dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    } else
1808dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = getDerived().TransformType(Name.getCXXNameType());
180981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
18111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
18131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
181481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
181581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
18161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
18171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
182081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
182181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
18221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
18233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
18243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1832d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
18331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1835d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
18371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
18421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
18461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1847f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
1848f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
18553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1859dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
1860dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1863ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
1864ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
1865ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
1866ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
1867ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
1868ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
18721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
1873d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1875d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1877d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1878d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1879d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1882d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1884f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
1885f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
1886f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
1887d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1888d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1889d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
1890833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
1891833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
1892833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1893833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
1894670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1895670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
18969f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
1897833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1898833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1899833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
1900833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
1901a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
1902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1905788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
1906788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
1907788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
1908788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1909833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
1910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
1911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
1914670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
1916828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
1917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
1923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
1924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
1926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
1927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
1928833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
1929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
19311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1932670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1933a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
1935a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
1936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
1941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1942670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1944670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
1946972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
1947972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
1948972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
1949788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
1950670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
1952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1953828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
1954828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
1955828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
1956828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
1957828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
1958828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (E.isInvalid())
1959828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = NULL;
1960828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      else {
1961828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = E.takeAs<Expr>();
1962828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr->Retain();
1963828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      }
1964828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
1965828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
1966828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
1967833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1968670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1970788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
1971788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
1972788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
1973788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
1974788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
1975788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
1976788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1977788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
1978788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
1979788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
1980788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
1981788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
1982788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1983670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
1984670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
19851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
1986670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
1989833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
1990833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1991833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
1992833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
1993833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
1994833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1995833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *ETaken = E.takeAs<Expr>();
1996828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    ETaken->Retain();
1997833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
1998833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1999670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2001670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2002670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2003670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
20041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2005670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2006670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2008833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2009833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2010833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2011828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2012828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2013828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2014828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2015833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2017828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2018670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2019670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
20201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2021670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2022828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2023833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2027670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2028833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2029670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2030670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) {
2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2042a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
20434802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2045a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(DI);
20461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2054a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
2055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
20571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
20591bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2061a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, TL);
2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2067a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
20819f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
20901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
20911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               QualifiedTypeLoc T) {
2094a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
21051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Result = SemaRef.Context.getQualifiedType(Result, Quals);
2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.push<QualifiedTypeLoc>(Result);
2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // No location information to preserve.
2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make
2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work.
2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \
2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType                                       \
2126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(TLB, TL.getPointeeLoc());   \
2127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (PointeeType.isNull())                                  \
2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();                                       \
2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();                            \
2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||                        \
2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != TL.getPointeeLoc().getType()) {         \
213385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().Rebuild##TypeClass(PointeeType,    \
213485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                          TL.getSigilLoc()); \
2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())                                     \
2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();                                     \
2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }                                                          \
2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result);    \
2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setSigilLoc(TL.getSigilLoc());                        \
2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;                                             \
2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0)
2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      BuiltinTypeLoc T) {
2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ComplexTypeLoc T) {
2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      PointerTypeLoc TL) {
2161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(PointerType);
2162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                  BlockPointerTypeLoc TL) {
2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(BlockPointerType);
2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
217185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
217285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
217385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
217485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
217585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
217685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
217785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
217885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               ReferenceTypeLoc TL) {
217985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
218085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
218185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
218285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
218385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
218485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
218585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
218685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
218785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
218885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
218985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
219085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
219185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
219285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
219385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
219485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
219585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
219685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
219785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
219885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
219985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
220085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
220485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
220585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
220685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2210a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 LValueReferenceTypeLoc TL) {
221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return TransformReferenceType(TLB, TL);
2212a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
22131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2214a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2215a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2216a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2217a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 RValueReferenceTypeLoc TL) {
221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return TransformReferenceType(TLB, TL);
2219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
22221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2223a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2224a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   MemberPointerTypeLoc TL) {
2225a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2226a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2227a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2231a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2232a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2233a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2238a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
224185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
224285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2243a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2248a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
22531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ConstantArrayTypeLoc TL) {
2257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
226885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
226985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2271a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
22771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              IncompleteArrayTypeLoc TL) {
2292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
230285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
230385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2319a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   VariableArrayTypeLoc TL) {
2320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2325670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2326670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2327670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
234385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
23531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             DependentSizedArrayTypeLoc TL) {
2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2366670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2367670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
23681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
238485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
23891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      DependentSizedExtVectorTypeLoc TL) {
2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2411670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2412670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2413670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2420eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2421eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     VectorTypeLoc TL) {
2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements());
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
24611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                        ExtVectorTypeLoc TL) {
2468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
24851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   FunctionProtoTypeLoc TL) {
2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
2494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ResultType.isNull())
2496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Transform the parameters.
2499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<QualType, 4> ParamTypes;
2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2504a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
2508a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      assert(OldDI->getType() == T->getArgType(i));
2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2511a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (!NewDI)
2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewDI == OldDI)
2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = OldParm;
2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      else
2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = ParmVarDecl::Create(SemaRef.Context,
2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getDeclContext(),
2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getLocation(),
2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getIdentifier(),
2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI->getType(),
2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI,
2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getStorageClass(),
2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      /* DefArg */ NULL);
2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
25381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamTypes.push_back(NewType);
2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamDecls.push_back(NewParm);
2541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
25421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getTypeQuals());
2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
25551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 FunctionNoProtoTypeLoc TL) {
2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2572a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2586ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2587ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2588ed97649e9574b9d854fa4d6109c9333ae0993554John McCall                                                 UnresolvedUsingTypeLoc TL) {
2589ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
2590ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  Decl *D = getDerived().TransformDecl(T->getDecl());
2591ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
2592ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
2593ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2594ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
2595ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2596ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
2597ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
2598ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
2599ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
2600ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2601ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
2602ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
2603ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2604ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
2605ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2606ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
2607ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
2608ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypedefTypeLoc TL) {
2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
2614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypeOfExprTypeLoc TL) {
2635670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
2636670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
26371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2638cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
2639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2644cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
26501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2652cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
2653cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2654cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     TypeOfTypeLoc TL) {
2662cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
2663cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
2664cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
2665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2668cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
2669cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
2670a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
26731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2675cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
2676cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2677cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2678cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       DecltypeTypeLoc TL) {
2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2688670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
2689670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
26901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2691577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2692577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2693577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     RecordTypeLoc TL) {
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
2715a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
2717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
27261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   EnumTypeLoc TL) {
2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
2737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2739577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
2740577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2754577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27557da2431c23ef1ee8acb114e39692246e1801afc2John McCall
27567da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ElaboratedTypeLoc TL) {
2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedType *T = TL.getTypePtr();
2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this should be a nested type.
27627da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
27637da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
27647da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
27651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
27787da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
27791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2781577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2782577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TemplateTypeParmTypeLoc TL) {
2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
2786577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
27881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
278949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
2790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         SubstTemplateTypeParmTypeLoc TL) {
2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
279349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
279449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
279549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
2796dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType
2797dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType(
2798a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TypeLocBuilder &TLB,
2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TemplateSpecializationTypeLoc TL) {
2800833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(TLB, TL, QualType());
2801833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2802a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2803833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2804833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2805833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
2806833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2810833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
2811833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
2812833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
2813833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
2814833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2815828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
2816828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2817828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
2818828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
2819828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
2822833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
2823833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
2824833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
2825833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2826833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2827833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
2828833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
2829dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
2830dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
2831dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
2832577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
2834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
2835833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2836833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
2837833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
28381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
2839dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
2840577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
2841577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2843d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
2844d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
2845d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
2846d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
2847d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
2848d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
2849d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
2850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2851d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
2852d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
28531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2854833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
2855833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2856833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
2857833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
2858833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
2859d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
28601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2861833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
2862833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
2863833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
2864833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
2865833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
2866833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
2867833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
2868833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
2869833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
28701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2871833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
2872577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   QualifiedNameTypeLoc TL) {
2878a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameType *T = TL.getTypePtr();
2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2881577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                SourceRange());
2882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
2892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Named != T->getNamedType()) {
2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2898a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2902577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2905a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2906a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       TypenameTypeLoc TL) {
2907a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameType *T = TL.getTypePtr();
2908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2909833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /* FIXME: preserve source information better than this */
2910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceRange SR(TL.getNameLoc());
2911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR);
2914577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
29161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2917a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result;
2918a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
29201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType NewTemplateId
2921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
2922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
2923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
29241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
2927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
2928577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
29291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2930a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR);
2933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ObjCInterfaceTypeLoc TL) {
294754e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCInterfaceType unimplemented");
294854e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
2949577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2952a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
2954a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               ObjCObjectPointerTypeLoc TL) {
295554e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCObjectPointerType unimplemented");
295654e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
295724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
295824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
2959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
296143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
296243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
296343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
29651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
297043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
297343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
297443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
298243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
29851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
29891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
29921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
299643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
299743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
29991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
300043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
300143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3003264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  OwningExprResult LHS(SemaRef), RHS(SemaRef);
3004264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3005264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3006264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3008264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3009264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3010264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3011264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
30121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3013264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3014264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3015264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3016264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3017264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
30181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
302043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
302643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
303043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
303143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
303843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
304343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
304543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
304843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
305543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
306143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
306343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
30661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
30671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
306843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
30698cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  OwningExprResult Cond(SemaRef);
30708cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
30718cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
30728cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    ConditionVar
30738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
30748cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
30758cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
30768cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
307799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
30788cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
30798cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor
308099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
308199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
308299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
30838cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor
30845ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
30851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
309243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
309899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
309943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
310043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
31011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
310499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Then),
31051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
310643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
310743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
310943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
311143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
3112d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  OwningExprResult Cond(SemaRef);
3113d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3114d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3115d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    ConditionVar
3116d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3117d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
3118d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3119d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
312099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3121d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
312299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
312399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
312499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
312599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
31261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31275ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
312899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
313099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond,
313199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                                                ConditionVar);
313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
314243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
314543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
31495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  OwningExprResult Cond(SemaRef);
31505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
31515656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
31525656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    ConditionVar
31535656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
31545656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
31555656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
31565656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
315799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
31585656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
315999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
316099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
316199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
316299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
31631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31645ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
316743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
317143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
317243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
317399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
317443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
317799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar,
317899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                       move(Body));
317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
318243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
320043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
320843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
321043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
321243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
321399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningExprResult Cond(SemaRef);
321499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
321599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
321699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    ConditionVar
321799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
321899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
321999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
322099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
322199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
322299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
322399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
322499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
322599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
322699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
32271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
323443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
324143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
32431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
32441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
32465ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson                                     move(Init), getSema().MakeFullExpr(Cond),
324799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                     ConditionVar,
32485ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson                                     getSema().MakeFullExpr(Inc),
324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
325043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
325143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
32531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
32541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
32561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
325943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
326043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
326143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
326343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
326743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
32691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
327143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
327243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
327443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
327543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
32781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
32841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
328843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
329143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
32941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
329543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
330043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
330643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition(*D);
330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
33151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
33171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
33181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
332143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
332343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
332443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
332643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
33271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
332943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement!
333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Inline assembly cannot be transformed");
33351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
333843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
334343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @try statement");
33441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
334843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
335143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @catch statement");
335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @finally statement");
33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
336643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @throw statement");
33681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
33741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @synchronized statement");
33771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
338043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
33831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C for-each statement");
33861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
339843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
340243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
34031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
3406a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                            ExceptionDecl->getTypeSourceInfo(),
340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
341043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
341143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
341443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
341943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
342243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
342343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
34291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
343843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
34401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
344143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
344343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
344643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
344743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
345143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
345543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
34611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
346343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
34641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
346543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
3469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3472454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
34741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
34751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3478454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
3479a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
3480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
3481a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3482a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                       E->getQualifierRange());
3483a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
3484a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3485a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3486dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3487dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
3488dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getDecl()));
3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3492a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3493a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
3494a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
3495dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      !E->hasExplicitTemplateArgumentList()) {
34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3497dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
3498dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
3499dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
3500a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3501dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return SemaRef.Owned(E->Retain());
3502a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3503dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3504dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
3505dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  if (E->hasExplicitTemplateArgumentList()) {
3506dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
3507dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
3508dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
3509dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3510dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TemplateArgumentLoc Loc;
3511dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
3512dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall        return SemaRef.ExprError();
3513dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TransArgs.addArgument(Loc);
3514dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    }
3515dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
3516dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3517a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
3518dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                         ND, E->getLocation(), TemplateArgs);
3519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3523454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3529454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3535454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3541454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
35421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3547454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
35481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3553454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
3554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
35591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
35651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3567454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
3568454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
35731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
3578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3582454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
3584a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
35855557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
3586a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
35875ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35905ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
35921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35935ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
35941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
35971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
35991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
36041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
36081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3620454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
36341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3643454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
36571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
36611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
3669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
36701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
36721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3682454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
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
3696f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
3697f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman    = cast_or_null<ValueDecl>(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() &&
37051f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson      !E->hasExplicitTemplateArgumentList()) {
37061f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson
37071f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
37081f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
37091f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37111f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
3712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3713d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
37148a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  if (E->hasExplicitTemplateArgumentList()) {
3715d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
3716d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
37178a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3718d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
3719d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
37208a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
3721d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
37228a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
37238a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
37248a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor
3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3729c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
3730c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
3731c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
3732c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
3733c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
3734c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
373783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
373883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
37408a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
3741d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                        (E->hasExplicitTemplateArgumentList()
3742d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
3743c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3748454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
37501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3755454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
37671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
37731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
3776454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
3777454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3782454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
380247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
38031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
380447e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
38091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3810454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
3811a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
3812a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
38136eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3818454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
38201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3825454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
38269d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
38279d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
38301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38349d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
38359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
38369d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3840a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
38416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
38469d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
38481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38509d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
38519d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            NewT,
3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3858454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
38621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation FakeTypeLoc
3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
38651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
38781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3887454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
3888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
38941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
38971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3906454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
39201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3923e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3928454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
39301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
393143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
393643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
39481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
39531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
39561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
39631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
39791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
39881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
3997454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
39985557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
39995557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
40005557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
40015557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
40081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4015454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
40181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
40351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4042454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4072c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult
4073454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
40741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
40821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4090454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
40951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
41081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4116454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
41331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4142454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
41431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4148454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4149668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
4150668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
4151668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
4152668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
4153668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
4154668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4155668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4156668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4157668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
4158668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
4159668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4160668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4161668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
4162668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4163668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4164668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      return SemaRef.ExprError();
4165668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4166668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
4167668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
4168668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
4169668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
4170668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4171668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
4172668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4173668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4174668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
41756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      if (getDerived().DropCallArgument(E->getArg(I)))
41766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor        break;
41776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
4178668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4179668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4180668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        return SemaRef.ExprError();
4181668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4182668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      // FIXME: Poor source location information.
4183668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      SourceLocation FakeCommaLoc
4184668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        = SemaRef.PP.getLocForEndOfToken(
4185668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4186668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      FakeCommaLocs.push_back(FakeCommaLoc);
4187668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      Args.push_back(Arg.release());
4188668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    }
4189668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4190668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc,
4191668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
4192668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        FakeCommaLocs.data(),
4193668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
4194668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4195668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4196668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4197668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
4198668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4199668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
4200668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
4201668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
4202668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
4203668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4204668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
4205668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
4206668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4207668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4208668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4209668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4210668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4211668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4212668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4213668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4218454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
42331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4244454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
4245454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4250454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
42519d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
42529d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
42551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
42581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42599d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
42609d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
42619d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4265a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
42666eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
42719d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
42731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
42859d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                              NewT,
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4294454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
4295454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4300454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
4301454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
4307454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
4308454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4313454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
4314454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
4320454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
43219d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
43229d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
43251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43269d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
43279d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
43289d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4332a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
43336eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
43389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
43401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
43459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                   NewT,
4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4353454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
43561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
43641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
43741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
43761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
43921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4393454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
43941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
4400454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
44011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4406454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
44081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4417828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4422454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4436454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
44371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (getDerived().AlwaysRebuild() &&
4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4446036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4451454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
44601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4470454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
449443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
45001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
45041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
45091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
45125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
45135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
45145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
45155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
45165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
45175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
45185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
45195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
45205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
45215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
45225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      ArraySize
45235b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
45245b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  ConsArrayT->getSize(),
45255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  SemaRef.Context.getSizeType(),
45265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  /*FIXME:*/E->getLocStart()));
45275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
45285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
45295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
45305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
45315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
45325b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
45335b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
45345b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
45355b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
45481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4553454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
4556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
45591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Operand.get() == E->getArgument())
45601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4570a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
4571454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
4572a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4573a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
4574a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
45751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4576a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
4577a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4578a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                E->getQualifierRange());
4579a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
4580a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
45811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4582a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  QualType DestroyedType;
4583a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  {
4584a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
4585a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    DestroyedType = getDerived().TransformType(E->getDestroyedType());
4586a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (DestroyedType.isNull())
4587a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
4588a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
45891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4590a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4591a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Base.get() == E->getBase() &&
4592a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Qualifier == E->getQualifier() &&
4593a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      DestroyedType == E->getDestroyedType())
4594a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.Owned(E->Retain());
45951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4596a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4597a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
4598a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
4599a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getDestroyedTypeLoc(),
4600a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     DestroyedType,
4601a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
4602a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getQualifierRange());
4603a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
46041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4605a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
4606a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
4607ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
4608454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
4609f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
4610f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4611f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
4612f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
4613f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4614f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
4615f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
4616f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
4617f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I));
46189f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
46199f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
46209f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
46219f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
46229f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
46239f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
46249f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
46259f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
4626f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4627f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
4628f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
4629f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
4630f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
4631f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
4632f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
4633f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
4634f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
4635f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4636f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
4637f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4638f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4639f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
4640f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
4641f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
4642f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4643f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
4644f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
4645f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
4646f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
4647f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
4648f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    Old->getQualifierRange());
4649f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
4650f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4652f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
4653f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
4654f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
4657f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
4658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
4659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
4661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
4662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
4663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
4664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
4665f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
4666f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4667f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
4668f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4669f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4670f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
4671f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4676454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
46781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
46861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
46901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4700865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
4701454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  DependentScopeDeclRefExpr *E) {
4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
4703f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4704f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                                E->getQualifierRange());
4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
470981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
471081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
471181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
47121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4713f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
4714f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
4715f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
4716f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        Name == E->getDeclName())
4717f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
47181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4719f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
4720f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
4721f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         Name, E->getLocation(),
4722f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
4723f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
4724d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
4725d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4727d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
4728d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4730d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4733f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
4734f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
4735f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       Name, E->getLocation(),
4736f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4741454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                              getDerived().TransformDecl(E->getConstructor()));
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
47596eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
47606eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
47616eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
47626eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
47636eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47784411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
47794411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
47855132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
47865132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4789454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
47905132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
47965132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
47975132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
48015132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
48025132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
4808454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXTemporaryObjectExpr *E) {
4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                            getDerived().TransformDecl(E->getConstructor()));
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
48231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
48391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
4843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
48441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
4851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
4852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
4858454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
4859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
4861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
4869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
48831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
4892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4896865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
4897454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXDependentScopeMemberExpr *E) {
4898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
4899aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
4900aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
4901aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
4902aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
4903aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
4904aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
4905aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
4906aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
4907aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
49081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
4910aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Sema::TypeTy *ObjectTy = 0;
4911aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4912aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
4913a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
4914aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                ObjectTy);
4915aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
4916aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
4917aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
4918aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
4919aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
4920aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
4921aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
4922aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
4923aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
4924aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
49251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49266cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
49276cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
4928c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
49296cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
49306cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
49316cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
49321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4933a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4934a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
4935a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4936a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
4937aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
4938aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
4939a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
4940a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
4941a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
49421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
4944dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4945aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            ObjectType);
494681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
494781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
49481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4949aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
49503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
49513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
49523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
4953aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
4954aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
49553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
49563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
49573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
49581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
49591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4960865d447ac6a4721ab58e898d014a21f2eff74b06John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
4961aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
49623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
49633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
49643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
49653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
4966129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
49673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
49683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
4969129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
49703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
49713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
4972d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
49733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4974d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
4975d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
49763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
4977d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
49783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
49791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4980865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
4981aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
4983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
4984a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
4985a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
49863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
4987129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     Name,
4988129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     E->getMemberLoc(),
4989129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
4990129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
4991129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
4992129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
4993129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult
4994454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
4995129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
4996aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
4997aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
4998aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
4999aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
5000aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5001aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5002aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5003aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5004aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5005aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5006129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5007129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5008129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5009129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5010129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5011129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange());
5012129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5013129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      return SemaRef.ExprError();
5014129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5015129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5016129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(),
5017129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5018129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5019129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5020129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5021129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
5022129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I));
50239f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
50249f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
50259f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
50269f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
50279f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
50289f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
50299f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
50309f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5031129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5032129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5033129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5034129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5035129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5036129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5037129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5038129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5039129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5040129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5041129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5042129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5043129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5044129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5045129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5046129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5047129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5048129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5050129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5051129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5052129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5053129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5054129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        return SemaRef.ExprError();
5055129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5056129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5057129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5058c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
5059c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5060c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5061c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5062c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5063c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5064129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5065129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  return getDerived().RebuildUnresolvedMemberExpr(move(Base),
5066aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
5067129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
5068129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
5069129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
5070129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
5071c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
5072129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
5073129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
5074129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5079454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5085454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
5090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
50941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
5097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
5098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5103454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
5104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5111454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
51121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5117454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
51181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ObjCProtocolDecl *Protocol
5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
5120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                getDerived().TransformDecl(E->getProtocol()));
5121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
5122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
51261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
5130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
5131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
5132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
51331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5138454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5146454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
5147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
515409105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
5155454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5163454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5171454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5179454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
5180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
5183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
5188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
5189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
51931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
5196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
5197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
5198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
52011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5202454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
52051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
52091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5210454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
5211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
52131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
5217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
5218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
5219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
522185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
522285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
522385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
5224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
5225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
522885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
522985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
523085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
5231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
5232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
52351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
523685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
523785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
523885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
523985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
524085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
5241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
52441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
524585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
524685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
524785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
52480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
524985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
5250577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
52531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
525485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType,
525585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     SourceLocation Sigil) {
525685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil,
5257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                  getDerived().getBaseEntity());
5258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5259a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
5262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
5263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
5264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
5265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
5266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
5267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
5268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
5269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
5270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
5271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
52721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
52741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
52751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
52761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
5277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
5278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
5279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
5280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
5281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
5282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
5283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
5284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
52851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
52871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
5288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
52891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
5290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
52911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
52931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
52941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
5295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
5296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
529785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
529885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
52991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
530085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
5301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
53041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
53051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
5306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
530785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
530885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
531085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
5311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
53141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
53151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
5316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
5318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
5319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
53201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
53261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
53271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
5328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
5330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
5331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
53321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
5339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   unsigned NumElements) {
5340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
5341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getVectorType(ElementType, NumElements);
5342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
5346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
5347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
5348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
5349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
5350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
53511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
5352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
5353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
5354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
5355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
53581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
53591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
5360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
5361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
5362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
5363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
53671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
5368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
53691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
5370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
53711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
5372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
5373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
5374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
5375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
5379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
5380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5383ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
5384ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
5385ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
5386ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5387ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
5388ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
5389ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
5390ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
5391ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
5392ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5393ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
5394ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
5395ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
5396ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5397ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
5398ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
5399ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
5400ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
5401ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
5402ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5403ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
5404ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
5405ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5406ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
5407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
5408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
5409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
5413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
5414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
5418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
5419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
5423833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
5424833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
5425d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
5426d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
5427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
54281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5429dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5430dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5431dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5432dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5433a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
5434c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
5435d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
5436dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
5437dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
5438dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
5439dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
5440dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
54411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
5442495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
5443c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
5444c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
544546646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
5446dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5447dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5448dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5449dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5450dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5451dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5452dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
5453dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5454dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5455dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5456dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5457dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5458dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5459dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5460dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
5461dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   QualType T) {
5462dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (T->isDependentType() || T->isRecordType() ||
5463dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
5464a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
5465dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5466dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
5467dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
54681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5469dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5470dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
5471dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
54721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5473d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
54741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5475d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5476d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
5477d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
54781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
5479d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
5480d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
5481d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
5482d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
54831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5484d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
54853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
54863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
5487d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
5488d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
54891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
5490014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
5491014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
54923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
54933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
54943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
5495014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor                                              Name,
5496a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
5497a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
54983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
5499d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
55001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5502ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
5503ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5504ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
5505ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
5506ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
5507ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
5508ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
5509ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
5510ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
5511ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
5512ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
5513ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return getSema().ActOnDependentTemplateName(
5514ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
5515ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              SS,
5516ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              Name,
5517a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
5518a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
5519ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor           .template getAsVal<TemplateName>();
5520ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
5521ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5522ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
55231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
5526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
5527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
5528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
5529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
5530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
5531ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
5532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
55331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
5535f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
5536f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    if (!FirstExpr->getType()->isOverloadableType() &&
5537f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl        !SecondExpr->getType()->isOverloadableType())
5538f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
5539ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                 CalleeExpr->getLocStart(),
5540f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       move(Second), OpLoc);
55411a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
55421a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
55431a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
5544f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  } else if (SecondExpr == 0 || isPostIncDec) {
5545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
5546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
5547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
55481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
55501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
55541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
5555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
5556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
55591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
5560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
55631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
5566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
5567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
55691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
5571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
5572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::FunctionSet Functions;
55731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5574ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
5575ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
5576ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
5577ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
5578ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
5579ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(),
5580ba13543329afac4a0d01304ec2ec4924d99306a6John McCall           E = ULE->decls_end(); I != E; ++I)
5581ba13543329afac4a0d01304ec2ec4924d99306a6John McCall      Functions.insert(AnyFunctionDecl::getFromNamedDecl(*I));
5582ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
5583ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    Functions.insert(AnyFunctionDecl::getFromNamedDecl(
5584ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                        cast<DeclRefExpr>(CalleeExpr)->getDecl()));
5585ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
55861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
5588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
5589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
55901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName OpName
5591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
5592644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl  SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs,
5593644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl                                  Functions);
55941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
5596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
55971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
5598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
56011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5602f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
5603ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
5604ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
5605ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(First),
5606ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(Second));
5607f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
5608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
56091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
56111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
5612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
5614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
5617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
56181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
5619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
5622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
5624