TreeTransform.h revision ddf889a2ad2888f1dea573987bbe952d9912c1a0
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) {
1021b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1022b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall                                         move(SubExpr));
1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
10261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T,
1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          RParenLoc, move(Init));
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
10381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1045aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1046129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
1047aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
1048aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1050129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
10512d1c21414199a7452f122598189363a3922605b1Douglas Gregor                                              DeclarationName(&Accessor),
1052129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              AccessorLoc,
1053129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
10571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1062e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1063e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
1064e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    OwningExprResult Result
1065e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1066e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1067e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1068e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor
1069e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1070e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1071e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1072e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1073e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
11051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
11151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1121f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1122f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
11761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
11949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
12019d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
12021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
12069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
12071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
12091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
12119d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
12131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
12151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
12179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
12181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
12251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
12359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1240c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
1241c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1242c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1243c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
12529d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1257c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1258c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1259c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1260c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
12699d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1274c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1275c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1276c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1277c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
12869d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1291c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
1292c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1293c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1294c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
13029d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                TypeSourceInfo *TInfo,
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
130688650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
13089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                               TInfo->getType().getAsOpaquePtr(),
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
131088650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
13111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
13401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
13431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1351828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1352828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1354828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1355828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1371036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1372036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1373036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1374036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
13851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
13861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
13871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
14081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
14431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
14471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1452865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1456f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1460f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1461f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
1462f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location,
1463f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1464f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1465f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location);
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1472f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1473f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1474f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1475d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1476f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
14844411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
14884411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
14894411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
14904411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
14914411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor      return getSema().ExprError();
14924411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor
14934411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
14944411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           move_arg(ConvertedArgs));
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1538865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
1539aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1542a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1543a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1544129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1546c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1547129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1549a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1550a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
15511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1552aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1553aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1554129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
1555129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            Name, MemberLoc, TemplateArgs);
1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1558129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1562129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE,
1563aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1564129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1565129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1566129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1567129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1568c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1569129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1570129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
15713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
15723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
15733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
15741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1575aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1576aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1577c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1578c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
15793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
15801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
15901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
16061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                             RParenLoc));
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
16171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
16221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
16251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
16270da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
16291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
16381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
16431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
16451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
164943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
165043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
165143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
165243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
165443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
165543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
16561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
165943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
166043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
166143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
16621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
166443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
166543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
166643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
166743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
166943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
167043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16725ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E));
167343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
16741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
16781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1680670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1681454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
1682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1689454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
16911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1694657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1695657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1696657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1697dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1699a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1700c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1701c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
17020979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
17030979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
17041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
170543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
17081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1709c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1710c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
1711dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1712dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
17131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
1715c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
1716a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
1717c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
1718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
1723a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
1724a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1725a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
1726dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1729a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
1730c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
1731c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
17321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
1736dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                            getDerived().TransformDecl(NNS->getAsNamespace()));
17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1752fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1754d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1755d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
17561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1758dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   T);
1765dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1766dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
17691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
1770dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1771dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1772dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
17731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
177481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
1775dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 SourceLocation Loc,
1776dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 QualType ObjectType) {
177781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
177881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
177981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
178081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
178181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
178281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
178381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
178481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
178581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
17863e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
17891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
179081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
179281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
179381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
1794dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    QualType T;
1795dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    if (!ObjectType.isNull() &&
1796dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1797dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      TemplateSpecializationType *SpecType
1798dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        = cast<TemplateSpecializationType>(Name.getCXXNameType());
1799dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = TransformTemplateSpecializationType(SpecType, ObjectType);
1800dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    } else
1801dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor      T = getDerived().TransformType(Name.getCXXNameType());
180281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
180381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
18041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
180581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
180781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
180881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
18091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
181181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
181281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
181381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
181481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
18151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
18163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
18173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
1818d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
18191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1820d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1821d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1822d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
18301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1831d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1832d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1837d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
18391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1840f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
1841f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
18451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
18483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1852dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
1853dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1856ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
1857ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
1858ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
1859ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
1860ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
1861ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
18651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1870d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1875d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1877f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
1878f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
1879f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
1880d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1881d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1882d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
1883833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
1884833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
1885833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1886833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
1887670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1888670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
18899f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
1890833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1891833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1892833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
1893833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
1894a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
1895833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1896833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1897833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1898788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
1899788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
1900788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
1901788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
1903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
1904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1905833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1906833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
1907670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
1909828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
1910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
1912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
1915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
1916833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
1917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
1923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
19241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1925670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1926a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
1927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
1928a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
1929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1930833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1935670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1937670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
1939972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
1940972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
1941972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
1942788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
1943670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1946828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
1947828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
1948828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
1949828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
1950828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
1951828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (E.isInvalid())
1952828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = NULL;
1953828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      else {
1954828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = E.takeAs<Expr>();
1955828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr->Retain();
1956828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      }
1957828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
1958828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
1959828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
1960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1961670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1963788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
1964788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
1965788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
1966788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
1967788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
1968788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
1969788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1970788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
1971788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
1972788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
1973788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
1974788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
1975788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1976670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
1977670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
19781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
1979670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
19801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1981833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
1982833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
1983833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1984833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
1985833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
1986833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
1987833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *ETaken = E.takeAs<Expr>();
1989828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    ETaken->Retain();
1990833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
1991833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1992670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1994670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
1995670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1996670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
19971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
1998670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
1999670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
20001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2001833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2002833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2003833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2004828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2005828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2006828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2007828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2008833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2009833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2010828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2011670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2012670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
20131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2014670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2015828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2017670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2018670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2020670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2021833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2022670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2023670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2026577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) {
2030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
20321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2034a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2035a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
20364802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2037a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2038a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(DI);
20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2041a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2047a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCallTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
2048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2049a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
20521bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, TL);
2057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2060a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
2066a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
20749f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2080a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
20831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
20841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               QualifiedTypeLoc T) {
2087a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
2090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2091577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
20981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Result = SemaRef.Context.getQualifiedType(Result, Quals);
2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.push<QualifiedTypeLoc>(Result);
2102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // No location information to preserve.
2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make
2116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work.
2117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \
2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType                                       \
2119a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(TLB, TL.getPointeeLoc());   \
2120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (PointeeType.isNull())                                  \
2121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();                                       \
2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();                            \
2124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||                        \
2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != TL.getPointeeLoc().getType()) {         \
212685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().Rebuild##TypeClass(PointeeType,    \
212785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                          TL.getSigilLoc()); \
2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())                                     \
2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();                                     \
2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }                                                          \
2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result);    \
2133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setSigilLoc(TL.getSigilLoc());                        \
2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;                                             \
2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0)
2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      BuiltinTypeLoc T) {
2141ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2142ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
2143ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
2144ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2145ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
2146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ComplexTypeLoc T) {
2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      PointerTypeLoc TL) {
2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(PointerType);
2159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                  BlockPointerTypeLoc TL) {
2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(BlockPointerType);
2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
216885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
216985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
217085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
217185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
217285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
217385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
217485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
217585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               ReferenceTypeLoc TL) {
217685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
217785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
217885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
217985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
218085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
218185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
218285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
218385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
218485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
218585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
218685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
218785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
218885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
218985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
219085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
219185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
219285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
219385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
219485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
219585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
219685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
219785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
219885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
219985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
220085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
220185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
220285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
220385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 LValueReferenceTypeLoc TL) {
220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return TransformReferenceType(TLB, TL);
2209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
22101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2211a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2212a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2213a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2214a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 RValueReferenceTypeLoc TL) {
221585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return TransformReferenceType(TLB, TL);
2216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
22191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2220a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2221a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   MemberPointerTypeLoc TL) {
2222a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2223a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2224a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2228a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2229a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2230a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2235a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2236a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
223885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
223985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2240a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2241a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2242a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2247a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2252a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ConstantArrayTypeLoc TL) {
2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2259a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2260a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2261a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2264a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
226585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
226685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2268a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2271a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
22741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              IncompleteArrayTypeLoc TL) {
2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2294a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
229985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
230085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   VariableArrayTypeLoc TL) {
2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2322670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2323670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2324670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2332a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2338a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
234085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
23501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             DependentSizedArrayTypeLoc TL) {
2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2363670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2364670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
23651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
238185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
23861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      DependentSizedExtVectorTypeLoc TL) {
2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2408670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2409670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2410670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2417eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2418eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     VectorTypeLoc TL) {
2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements());
2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
24581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                        ExtVectorTypeLoc TL) {
2465a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
24821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   FunctionProtoTypeLoc TL) {
2490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
2491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ResultType.isNull())
2493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2495a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Transform the parameters.
2496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<QualType, 4> ParamTypes;
2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2500a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2501a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2504a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
2505a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
2506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      assert(OldDI->getType() == T->getArgType(i));
2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2508a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (!NewDI)
2510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2511a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2512a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewDI == OldDI)
2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = OldParm;
2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      else
2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        NewParm = ParmVarDecl::Create(SemaRef.Context,
2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getDeclContext(),
2517a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getLocation(),
2518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getIdentifier(),
2519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI->getType(),
2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      NewDI,
2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      OldParm->getStorageClass(),
2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      /* DefArg */ NULL);
2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
2533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall        return QualType();
2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
25351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamTypes.push_back(NewType);
2537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParamDecls.push_back(NewParm);
2538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
25391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2541a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2545a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2546a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2547a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getTypeQuals());
2549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
25521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 FunctionNoProtoTypeLoc TL) {
2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2572a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2583ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2584ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2585ed97649e9574b9d854fa4d6109c9333ae0993554John McCall                                                 UnresolvedUsingTypeLoc TL) {
2586ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
2587ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  Decl *D = getDerived().TransformDecl(T->getDecl());
2588ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
2589ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
2590ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2591ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
2592ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2593ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
2594ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
2595ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
2596ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
2597ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2598ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
2599ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
2600ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2601ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
2602ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2603ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
2604ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
2605ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypedefTypeLoc TL) {
2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
2611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
26251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      TypeOfExprTypeLoc TL) {
2632670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
2633670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
26341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2635cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
2636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2641cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
26471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2649cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
2650cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2651cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2657a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     TypeOfTypeLoc TL) {
2659cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
2660cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
2661cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
2662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2665cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
2666cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
26701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2672cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
2673cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2674cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2675cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
2676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       DecltypeTypeLoc TL) {
2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2685670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
2686670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
26871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2688577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     RecordTypeLoc TL) {
2710a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
2711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
27231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2728577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   EnumTypeLoc TL) {
2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
2734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2736577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
2737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2751577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27527da2431c23ef1ee8acb114e39692246e1801afc2John McCall
27537da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                      ElaboratedTypeLoc TL) {
2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedType *T = TL.getTypePtr();
2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this should be a nested type.
27597da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
27607da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
27617da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
27621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
27757da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
27761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2778577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2779577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TemplateTypeParmTypeLoc TL) {
2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
2783577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
27851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
278649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         SubstTemplateTypeParmTypeLoc TL) {
2789a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
279049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
279149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
279249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
2793dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregorinline QualType
2794dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas GregorTreeTransform<Derived>::TransformTemplateSpecializationType(
2795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TypeLocBuilder &TLB,
2796a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                          TemplateSpecializationTypeLoc TL) {
2797833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(TLB, TL, QualType());
2798833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2800833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2801833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2802833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
2803833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2804833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
2805833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2807833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
2808833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
2809833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
2810833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
2811833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2812828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
2813828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2814828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
2815828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
2816828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
2817833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2818833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
2819833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
2820833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
2821833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
2822833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2823833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2824833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
2825833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
2826dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
2827dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
2828dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
2829577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2830833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
2831833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
2832833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
2834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
28351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
2836dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
2837577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
2838577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2840d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
2841d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
2842d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
2843d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
2844d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
2845d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
2846d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
2847577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2848d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
2849d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
28501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2851833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
2852833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2853833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
2854833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
2855833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
2856d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
28571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2858833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
2859833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
2860833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
2861833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
2862833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
2863833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
2864833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
2865833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
2866833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2868833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
2869577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2874a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   QualifiedNameTypeLoc TL) {
2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameType *T = TL.getTypePtr();
2876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2878577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                SourceRange());
2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2886a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Named != T->getNamedType()) {
2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2897a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2898a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2902a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2903a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                       TypenameTypeLoc TL) {
2904a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameType *T = TL.getTypePtr();
2905833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2906833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /* FIXME: preserve source information better than this */
2907833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceRange SR(TL.getNameLoc());
2908833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR);
2911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
29131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2914a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result;
2915a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
29171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType NewTemplateId
2918577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
2919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
2920577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
29211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
2924577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
2925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
29261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2929833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR);
2930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2933a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2936577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2942a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
2943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ObjCInterfaceTypeLoc TL) {
294454e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCInterfaceType unimplemented");
294554e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
2946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               ObjCObjectPointerTypeLoc TL) {
295254e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCObjectPointerType unimplemented");
295354e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
295424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
295524fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
2956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
295743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
295843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
295943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
296043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
29621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
296343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
296443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
296543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
296643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
296743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
296843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
296943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
297043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
297143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
297243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
297443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
297543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
297643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
297743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
297843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
297943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
298043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
298143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
29821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
298443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
298543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
29861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
298743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
298843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
29891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
299043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
299143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
299243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
299343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
299443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
299543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
29961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
299743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
299843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
29991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3000264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  OwningExprResult LHS(SemaRef), RHS(SemaRef);
3001264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3002264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3003264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3005264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3006264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3007264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3008264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3010264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3011264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3012264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3013264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3014264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
30151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
301743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
301843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
301943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
302043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
302143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
302243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
302343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
302443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
302543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
302843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
302943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
303043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
303243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
303343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
303443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
303543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
303643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
303743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
303943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
304043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
304143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
304243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
304543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
304643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
304743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
305043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
305243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
305343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
305443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
305843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
306043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
30631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
30641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
30668cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  OwningExprResult Cond(SemaRef);
30678cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
30688cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
30698cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    ConditionVar
30708cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
30718cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
30728cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
30738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
307499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
30758cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
30768cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor
307799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
307899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
307999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
30808cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor
30815ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
30821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
308543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
30921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
309599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
30981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
30991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
310199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Then),
31021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
310343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
310443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
310543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
310643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
310843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
3109d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  OwningExprResult Cond(SemaRef);
3110d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3111d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3112d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    ConditionVar
3113d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3114d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
3115d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3116d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
311799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3118d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
311999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
312099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
312199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
312299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
31231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31245ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
312599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
312799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond,
312899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                                                ConditionVar);
312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
313043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
314243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
314543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
31465656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  OwningExprResult Cond(SemaRef);
31475656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
31485656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
31495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    ConditionVar
31505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
31515656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
31525656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
31535656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
315499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
31555656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
315699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
315799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
315899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
315999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31615ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
31621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
316343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
316543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
316643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
316843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
316943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
317099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
317143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
317499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar,
317599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                       move(Body));
317643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
317843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
317943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
318043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
318143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
318243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
318343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
318843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
319343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
31951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
319943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
320143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
320243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
321099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningExprResult Cond(SemaRef);
321199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
321299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
321399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    ConditionVar
321499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
321599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                   getDerived().TransformDefinition(S->getConditionVariable()));
321699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
321799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
321899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
321999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
322099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
322199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
322299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
322399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
32241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
322543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
322643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
322743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
322843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
323143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
323843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
323943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
32401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
32411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
32435ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson                                     move(Init), getSema().MakeFullExpr(Cond),
324499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                     ConditionVar,
32455ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson                                     getSema().MakeFullExpr(Inc),
324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
324743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
324843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
324943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
32501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
32511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
325243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
32531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
325443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
325543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
325643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
325743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
325843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
326043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
326143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
326243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
326443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
326543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
32661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
326743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
327143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
327243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
32751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
327843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
327943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
32811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
328243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
328843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
329043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
32911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
329443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
329943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
330043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition(*D);
330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
330543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
33061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
330843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
33091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
33141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
33151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
331743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
331843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
332043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
332143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
332343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
33241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
332543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
332643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
332743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
332843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
332943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
333043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement!
333143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Inline assembly cannot be transformed");
33321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
333543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
333643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @try statement");
33411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
334743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
334843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @catch statement");
334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
335043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
335243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @finally statement");
33571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
335843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
336043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @throw statement");
33651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
336643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
337043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
337343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @synchronized statement");
33741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
33801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
338143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
338243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C for-each statement");
33831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
338443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
338743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
338843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
339043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
339343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
339843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
34001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
340243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
3403a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                            ExceptionDecl->getTypeSourceInfo(),
340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
340643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
341043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
341143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
341743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
341943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
34261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
34371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
343843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
344343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
344443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
34461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
344743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
344943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
34501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
34611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
3465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
3466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
34671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3469454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
34711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
34721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
34741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3475454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
3476a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
3477a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
3478a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3479a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                       E->getQualifierRange());
3480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
3481a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3482a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3483dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3484dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
3485dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getDecl()));
3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3489a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3490a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
3491a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
3492dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      !E->hasExplicitTemplateArgumentList()) {
34931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3494dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
3495dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
3496dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
3497a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3498dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return SemaRef.Owned(E->Retain());
3499a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3500dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3501dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
3502dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  if (E->hasExplicitTemplateArgumentList()) {
3503dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
3504dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
3505dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
3506dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3507dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TemplateArgumentLoc Loc;
3508dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
3509dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall        return SemaRef.ExprError();
3510dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TransArgs.addArgument(Loc);
3511dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    }
3512dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
3513dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3514a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
3515dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                         ND, E->getLocation(), TemplateArgs);
3516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3520454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
35211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3526454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
35271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3532454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
35331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3538454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
35391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3544454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
35451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3550454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
3551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
35561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
3559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
3560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
35621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3564454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
3565454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
35701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3579454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
3581a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
35825557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
3583a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
35845ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
35861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35875ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35905ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
35941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
35961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
36011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
3604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
36051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3617454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
36311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3640454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
36541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
36581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3679454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
3680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
368483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
368583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
36861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
368783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
368883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                                  E->getQualifierRange());
3689c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
369083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
369183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
36921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3693f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
3694f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
370083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
37018a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
37021f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson      !E->hasExplicitTemplateArgumentList()) {
37031f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson
37041f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
37051f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
37061f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37081f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3710d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
37118a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  if (E->hasExplicitTemplateArgumentList()) {
3712d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
3713d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
37148a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3715d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
3716d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
37178a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
3718d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
37198a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
37208a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
37218a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor
3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3726c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
3727c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
3728c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
3729c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
3730c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
3731c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
3732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
373483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
373583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
37378a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
3738d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                        (E->hasExplicitTemplateArgumentList()
3739d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
3740c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3745454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
37471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3752454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
37641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
37701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
3773454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
3774454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3779454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
37971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
379947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
380147e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
38061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3807454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
3808a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
3809a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
38106eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3815454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
38171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3822454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
38239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
38249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
38271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
38301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38319d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
38329d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
38339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3837a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
38386eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
38439d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
38451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38479d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
38489d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            NewT,
3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
38541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3855454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation FakeTypeLoc
3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
38621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
38751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3884454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
38941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3903454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
39051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
3913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
39171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3920e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3925454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
39271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
392843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
393343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
3938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
39451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
39501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
39531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
39581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
39601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
39681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
39731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
39851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
3994454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
39955557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
39965557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
39975557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
39985557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4012454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
40151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
40321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4039454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4063454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4069c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult
4070454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
40711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
40791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4087454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
40921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
41051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4113454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
41301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4139454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
41401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4145454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4146668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
4147668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
4148668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
4149668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
4150668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
4151668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4152668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4153668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4154668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
4155668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
4156668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4157668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4158668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
4159668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4160668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4161668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      return SemaRef.ExprError();
4162668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4163668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
4164668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
4165668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
4166668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
4167668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4168668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
4169668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4170668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4171668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
41726eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      if (getDerived().DropCallArgument(E->getArg(I)))
41736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor        break;
41746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
4175668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4176668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4177668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        return SemaRef.ExprError();
4178668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4179668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      // FIXME: Poor source location information.
4180668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      SourceLocation FakeCommaLoc
4181668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        = SemaRef.PP.getLocForEndOfToken(
4182668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4183668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      FakeCommaLocs.push_back(FakeCommaLoc);
4184668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      Args.push_back(Arg.release());
4185668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    }
4186668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4187668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc,
4188668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
4189668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        FakeCommaLocs.data(),
4190668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
4191668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4192668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4193668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4194668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
4195668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4196668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
4197668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
4198668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
4199668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
4200668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4201668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
4202668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
4203668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4204668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4205668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4206668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4207668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4208668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4209668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4210668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4215454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
42301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
42341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4241454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
4242454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4247454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
42489d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
42499d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
42521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
42551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42569d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
42579d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
42589d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4262a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
42636eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
42689d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
42701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
42731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
4279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
42801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
42829d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                              NewT,
4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4291454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
4292454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4297454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
4298454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
4304454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
4305454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4310454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
4311454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
4317454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
43189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
43199d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
43221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
43249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
43259d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4329a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
43306eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
43359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
4341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
43429d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                   NewT,
4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4350454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
43531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
43611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
43711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
43731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
43891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4390454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
43911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
4397454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4403454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
44051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4414828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4419454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
44261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4433454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
44341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (getDerived().AlwaysRebuild() &&
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4443036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4448454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4467454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
449143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
4500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
45011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
4504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
4505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
45061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45085b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
45095b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
45105b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
45115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
45125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
45135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
45145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
45155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
45165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
45175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
45185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
45195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      ArraySize
45205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
45215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  ConsArrayT->getSize(),
45225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  SemaRef.Context.getSizeType(),
45235b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  /*FIXME:*/E->getLocStart()));
45245b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
45255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
45265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
45275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
45285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
45295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
45305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
45315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
45325b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
45451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4550454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
4551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
45561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Operand.get() == E->getArgument())
45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4567a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
4568454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
4569a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4570a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
4571a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
45721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4573a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
4574a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4575a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                E->getQualifierRange());
4576a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
4577a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
45781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4579a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  QualType DestroyedType;
4580a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  {
4581a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
4582a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    DestroyedType = getDerived().TransformType(E->getDestroyedType());
4583a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (DestroyedType.isNull())
4584a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
4585a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
45861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4587a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4588a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Base.get() == E->getBase() &&
4589a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Qualifier == E->getQualifier() &&
4590a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      DestroyedType == E->getDestroyedType())
4591a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.Owned(E->Retain());
45921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4593a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4594a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
4595a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
4596a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getDestroyedTypeLoc(),
4597a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     DestroyedType,
4598a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
4599a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getQualifierRange());
4600a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
46011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4602a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
4603a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
4604ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
4605454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
4606f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
4607f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4608f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
4609f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
4610f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4611f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
4612f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
4613f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
4614f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I));
46159f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
46169f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
46179f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
46189f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
46199f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
46209f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
46219f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
46229f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
4623f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4624f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
4625f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
4626f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
4627f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
4628f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
4629f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
4630f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
4631f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
4632f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4633f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
4634f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4635f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4636f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
4637f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
4638f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
4639f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4640f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
4641f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
4642f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
4643f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
4644f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
4645f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    Old->getQualifierRange());
4646f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
4647f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4648f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4649f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
4650f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
4651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4652f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4653f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
4654f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
4655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
4656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4657f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
4658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
4659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
4660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
4661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
4662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
4663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
4665f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4666f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4667f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
4668f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4673454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
46751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
46831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
46871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4697865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
4698454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  DependentScopeDeclRefExpr *E) {
4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
4700f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4701f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor                                                E->getQualifierRange());
4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
470681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
470781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
470881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
47091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4710f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
4711f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
4712f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
4713f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        Name == E->getDeclName())
4714f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
47151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4716f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
4717f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
4718f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         Name, E->getLocation(),
4719f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
4720f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
4721d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
4722d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4724d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
4725d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4727d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
4728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4730f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
4731f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
4732f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       Name, E->getLocation(),
4733f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4738454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                              getDerived().TransformDecl(E->getConstructor()));
4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
47531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
47566eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
47576eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
47586eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
47596eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
47606eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47754411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
47764411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
47825132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
47835132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4786454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
47875132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
47935132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
47945132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
47985132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
47995132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
4805454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXTemporaryObjectExpr *E) {
4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                            getDerived().TransformDecl(E->getConstructor()));
4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
48201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
48361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
4839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
48411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
4850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
4855454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
4858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
4866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
4879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
48801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
4883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
4885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4893865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
4894454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXDependentScopeMemberExpr *E) {
4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
4896aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
4897aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
4898aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
4899aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
4900aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
4901aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
4902aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
4903aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
4904aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
49051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4906aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
4907aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Sema::TypeTy *ObjectTy = 0;
4908aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
4910a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
4911aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                ObjectTy);
4912aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
4913aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
4914aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
4915aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
4916aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
4917aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
4918aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
4919aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
4920aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
4921aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
49221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49236cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
49246cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
4925c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
49266cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
49276cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
49286cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
49291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4930a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4931a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
4932a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4933a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
4934aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
4935aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
4936a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
4937a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
4938a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
49391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
4941dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4942aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            ObjectType);
494381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
494481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
49451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4946aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
49473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
49483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
49493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
4950aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
4951aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
49523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
49533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
49543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
49551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
49561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4957865d447ac6a4721ab58e898d014a21f2eff74b06John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
4958aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
49593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
49603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
49613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
49623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
4963129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
49643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
49653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
4966129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
49673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
49683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
4969d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
49703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4971d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
4972d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
49733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
4974d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
49753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
49761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4977865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
4978aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
4979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
4980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
4981a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
4982a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
49833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
4984129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     Name,
4985129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     E->getMemberLoc(),
4986129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
4987129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
4988129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
4989129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
4990129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult
4991454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
4992129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
4993aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
4994aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
4995aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
4996aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
4997aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
4998aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
4999aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5000aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5001aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5002aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5003129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5004129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5005129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5006129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5007129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5008129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange());
5009129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5010129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      return SemaRef.ExprError();
5011129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5012129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5013129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(),
5014129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5015129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5016129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5017129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5018129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
5019129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    NamedDecl *InstD = static_cast<NamedDecl*>(getDerived().TransformDecl(*I));
50209f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
50219f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
50229f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
50239f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
50249f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
50259f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
50269f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
50279f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5028129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5029129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5030129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5031129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5032129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5033129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5034129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5035129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5036129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5037129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5038129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5039129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5040129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5041129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5042129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5043129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5044129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5045129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5046129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5047129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5048129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5050129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5051129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        return SemaRef.ExprError();
5052129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5053129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5054129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5055c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
5056c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5057c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5058c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5059c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5060c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5061129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5062129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  return getDerived().RebuildUnresolvedMemberExpr(move(Base),
5063aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
5064129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
5065129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
5066129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
5067129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
5068c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
5069129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
5070129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
5071129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5076454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
50771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
50811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5082454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
5085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
50911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
5096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5100454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5108454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
51091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5114454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
51151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ObjCProtocolDecl *Protocol
5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                getDerived().TransformDecl(E->getProtocol()));
5118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
51231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
51301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5135454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5143454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
5144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
515109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
5152454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
5153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5160454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
5161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5168454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
5169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
51711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5176454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
5177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
5179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
5180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
5186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
51901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
5193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
5194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
5195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
51981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5199454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
5200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
52021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
52061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5207454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
5208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
52101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
5214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
5215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
5216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
521885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
521985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
522085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
5221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
5222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
522585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
522685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
522785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
5228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
5229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
52321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
523385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
523485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
523585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
523685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
523785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
5238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
52401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
52411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
524285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
524385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
524485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
52450953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
524685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
5247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
52501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
525185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType,
525285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     SourceLocation Sigil) {
525385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil,
5254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                  getDerived().getBaseEntity());
5255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5256a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5257a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
5259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
5260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
5261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
5262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
5263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
5264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
5265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
5266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
5267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
5268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
52691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
52711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
52721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
52731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
5274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
5275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
5276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
5277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
5278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
5279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
5280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
5281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
52821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
52841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
5285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
52861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
5287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
52881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
52901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
52911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
5292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
5293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
529485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
529585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
52961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
529785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
5298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
53011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
53021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
5303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
530485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
530585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
53061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
530785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
5308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
53111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
53121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
5313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
5315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
5316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
53171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
53231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
53241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
5325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
5327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
5328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
53291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
5336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   unsigned NumElements) {
5337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
5338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getVectorType(ElementType, NumElements);
5339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
5343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
5344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
5345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
5346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
5347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
53481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
5349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
5350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
5351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
5352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
53551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
53561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
5357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
5358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
5359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
5360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
53641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
5365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
53661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
5367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
53681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
5369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
5370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
5371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
5372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
5376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
5377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5380ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
5381ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
5382ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
5383ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5384ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
5385ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
5386ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
5387ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
5388ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
5389ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5390ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
5391ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
5392ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
5393ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5394ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
5395ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
5396ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
5397ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
5398ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
5399ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5400ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
5401ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
5402ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5403ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
5404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
5405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
5406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
5410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
5411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
5415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
5416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
5420833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
5421833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
5422d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
5423d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
5424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
54251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5426dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5427dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5428dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5429dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5430a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
5431c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
5432d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
5433dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
5434dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
5435dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
5436dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
5437dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
54381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
5439495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
5440c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
5441c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
544246646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
5443dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5444dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5445dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5446dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5447dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5448dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5449dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
5450dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5451dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5452dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5453dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5454dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5455dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5456dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5457dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
5458dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   QualType T) {
5459dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (T->isDependentType() || T->isRecordType() ||
5460dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
5461a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
5462dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5463dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
5464dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
54651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5466dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5467dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
5468dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
54691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5470d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
54711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5472d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5473d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
5474d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
54751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
5476d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
5477d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
5478d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
5479d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
54801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5481d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
54823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
54833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
5484d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
5485d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
54861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
5487014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
5488014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
54893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
54903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
54913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
5492014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor                                              Name,
5493a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
5494a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
54953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
5496d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
54971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5499ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
5500ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5501ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
5502ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
5503ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
5504ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
5505ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
5506ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
5507ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
5508ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
5509ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
5510ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return getSema().ActOnDependentTemplateName(
5511ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
5512ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              SS,
5513ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              Name,
5514a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
5515a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
5516ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor           .template getAsVal<TemplateName>();
5517ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
5518ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5519ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
55201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
5523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
5524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
5525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
5526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
5527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
5528ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
5529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
55301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
5532f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
5533f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    if (!FirstExpr->getType()->isOverloadableType() &&
5534f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl        !SecondExpr->getType()->isOverloadableType())
5535f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
5536ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                 CalleeExpr->getLocStart(),
5537f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       move(Second), OpLoc);
55381a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
55391a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
55401a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
5541f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  } else if (SecondExpr == 0 || isPostIncDec) {
5542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
5543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
5544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
55451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
5546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
55471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
55511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
5554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
5555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
55561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
5559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
55601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
5563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
5564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
55661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
5569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::FunctionSet Functions;
55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5571ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
5572ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
5573ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
5574ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
5575ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
5576ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    for (UnresolvedLookupExpr::decls_iterator I = ULE->decls_begin(),
5577ba13543329afac4a0d01304ec2ec4924d99306a6John McCall           E = ULE->decls_end(); I != E; ++I)
5578ba13543329afac4a0d01304ec2ec4924d99306a6John McCall      Functions.insert(AnyFunctionDecl::getFromNamedDecl(*I));
5579ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
5580ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    Functions.insert(AnyFunctionDecl::getFromNamedDecl(
5581ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                        cast<DeclRefExpr>(CalleeExpr)->getDecl()));
5582ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
55831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
5585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
5586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
55871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName OpName
5588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
5589644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl  SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs,
5590644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl                                  Functions);
55911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
5593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
55941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
5595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
55981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5599f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
5600ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
5601ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
5602ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(First),
5603ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(Second));
5604f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
5605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
56061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
5607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
56081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
5609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
5611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
5614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
56151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
5616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
5619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
5621