TreeTransform.h revision 21ef0fa27b0783ec0bc6aa5b524feb2ec840f952
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.
194124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType TransformType(QualType T, QualType ObjectType = QualType());
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.
204124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  TypeSourceInfo *TransformType(TypeSourceInfo *DI,
205124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                QualType ObjectType = QualType());
206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
211124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL,
212124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                         QualType ObjectType = QualType());
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
214657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
21743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
21843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
21943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
22043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
22143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
22243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
225657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
226657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
233454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult TransformExpr(Expr *E);
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
239dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
2407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
24243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
24543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2467c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
247aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    return getDerived().TransformDecl(Loc, D);
2487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  }
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// This specific declaration transformation only applies to the first
2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
2607c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
2616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
2626cd219879ffce00920189ec1dcea927a42602961Douglas Gregor
263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
266dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
267dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
269a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
270c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
271c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
27681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
27781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
27881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
27981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName TransformDeclarationName(DeclarationName Name,
280dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           SourceLocation Loc,
281dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           QualType ObjectType = QualType());
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
285d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
287d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
295670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
296670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
306a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// \brief Fakes up a TypeSourceInfo for a type.
307a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
308a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return SemaRef.Context.getTrivialTypeSourceInfo(T,
309833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
310833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
314124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T, \
315124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType = QualType());
316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms the parameters of a function type into the
31921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// given vectors.
32021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// The result vectors should be kept in sync; null entries in the
32221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// variables vector are acceptable.
32321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// Return true on error.
32521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
32621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<QualType> &PTypes,
32721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<ParmVarDecl*> &PVars);
32821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
32921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms a single function-type parameter.  Return null
33021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// on error.
33121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm);
33221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
333124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL,
334124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType);
33585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
336dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  QualType
337dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
338dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
34043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
34343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
345454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult Transform##Node(Node *E);
346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent)
347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
35985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
36185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
37085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
37185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
37885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
37985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new Objective C object pointer type.
38285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildObjCObjectPointerType(QualType PointeeType,
38385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        SourceLocation Sigil);
384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
40785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
40885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
41785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
41885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
44782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
44882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    bool IsAltiVec, bool IsPixel);
4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
479ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// \brief Rebuild an unresolved typename type, given the decl that
480ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// the UnresolvedUsingTypenameDecl was transformed to.
481ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType RebuildUnresolvedUsingType(Decl *D);
482ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4977da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4987da2431c23ef1ee8acb114e39692246e1801afc2John McCall  /// \brief Build a new elaborated type.
4997da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
5007da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return SemaRef.Context.getElaboratedType(T, Tag);
5017da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
526833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
527d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &Args);
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, builds a new QualifiedNameType type from the
5321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// nested-name-specifier and the named type. Subclasses may override
533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
5361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypenameType type from the nested-name-specifier
5411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and the given type. Subclasses may override this routine to provide
542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
544ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor    if (NNS->isDependent()) {
545ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor      CXXScopeSpec SS;
546ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor      SS.setScopeRep(NNS);
547ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
548ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor        return SemaRef.Context.getTypenameType(NNS,
549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
550ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor    }
5511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
5531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
5581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// (or qualified name type). Subclasses may override this routine to provide
559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
5601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
561833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                               const IdentifierInfo *Id,
562833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                               SourceRange SR) {
563833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return SemaRef.CheckTypenameType(NNS, *Id, SR);
564dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
5651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
568dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
569dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
570dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
571dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
572dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
573dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
574a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
575c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
576c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
577dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
578dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
579dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
580dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
581dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
582dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
583dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
584dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
585dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
586dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
587dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
588dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
589dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
590dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
591dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
592dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
593dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
594dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
595dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
596dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
597edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  QualType T);
598d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
599d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
600d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
601d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
602d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
603d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
604d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
605d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
606d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
607d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
608d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
609d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
610d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
611d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
612d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
613d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
614d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
615d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
616d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
6173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
6183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
6191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
620ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
621ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
622ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
623ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
624ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
625ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
626ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
627ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
628ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
629ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
630ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
69299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 VarDecl *CondVar, StmtArg Then,
69399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 SourceLocation ElseLoc, StmtArg Else) {
69499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar),
69599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 move(Then), ElseLoc, move(Else));
69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
70299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningStmtResult RebuildSwitchStmtStart(Sema::FullExprArg Cond,
70399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                          VarDecl *CondVar) {
70499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnStartOfSwitchStmt(Cond, DeclPtrTy::make(CondVar));
70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    Sema::FullExprArg Cond,
72399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
72599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond, DeclPtrTy::make(CondVar),
72699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Body));
72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
7381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
74899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  StmtArg Init, Sema::FullExprArg Cond,
74999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
75199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond,
75299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  DeclPtrTy::make(CondVar),
75399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  Inc, RParenLoc, move(Body));
75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
78143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
7821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
7911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
800703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
801703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
802703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
803703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
804703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc,
805703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
806703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
807703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
808703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
809ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
810703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
811703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
812703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  ExprArg AsmString,
813703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
814703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
815703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
816703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
817703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
818703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  move(Exprs), move(AsmString), move(Clobbers),
819703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
820703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
821703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
82243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
82343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
82443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
82543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
8261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
827a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
82843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
82943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
83043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
8311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
83243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
83343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
83443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
83643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
83743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
83943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
84043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
84143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
84243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
84443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
84543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
84743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
84843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
84943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
85043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
85143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
85243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
85343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
85443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
85543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
861f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
862f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              LookupResult &R,
863f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              bool RequiresADL) {
864f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
865f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
866f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
867f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
868f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
869f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
870f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
871f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
872a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
873a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
874dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      ValueDecl *VD, SourceLocation Loc,
875dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      TemplateArgumentListInfo *TemplateArgs) {
876a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
877a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
878a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
879dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
880dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
881dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
882dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return getSema().BuildDeclarationNameExpr(SS, Loc, VD);
883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
8861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
894a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
8951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
896a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
897a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
898a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
899a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
900a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
901a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                NestedNameSpecifier *Qualifier,
90226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceRange QualifierRange,
90326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  TypeSourceInfo *ScopeType,
90426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceLocation CCLoc,
905fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                  SourceLocation TildeLoc,
906a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
9156ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr));
916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
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.
922a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
9235ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
925a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
9301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
9351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
9401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
9461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
9541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
9591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
9711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
9751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
97683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
97783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
97883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
979f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                                     ValueDecl *Member,
980d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
9818a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
982d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
983d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
984d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98683a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor      Expr *BaseExpr = Base.takeAs<Expr>();
9875fccd36204f11c8491325038e6ffcc784399098eDouglas Gregor      if (getSema().PerformObjectMemberConversion(BaseExpr, Qualifier, Member))
98883a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        return getSema().ExprError();
9898aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
99183a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        new (getSema().Context) MemberExpr(BaseExpr, isArrow,
992d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
993d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
994d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
995d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
9961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
99883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
99983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
100083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
100183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
100283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
1003aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
1004aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1005c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    LookupResult R(getSema(), Member->getDeclName(), MemberLoc,
1006c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                   Sema::LookupMemberName);
1007c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.addDecl(Member);
1008c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1009c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
1010aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1011aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                              OpLoc, isArrow,
1012129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1013c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
10236ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc,
10246ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor                                LHS.takeAs<Expr>(), RHS.takeAs<Expr>());
1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
10361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
10411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
10459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
1048b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1049b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall                                         move(SubExpr));
1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
10531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
105742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
106042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
106142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              move(Init));
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
10651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1072aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1073129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
1074aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
1075aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1076129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1077129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
10782d1c21414199a7452f122598189363a3922605b1Douglas Gregor                                              DeclarationName(&Accessor),
1079129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              AccessorLoc,
1080129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
10841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1089e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1090e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
1091e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    OwningExprResult Result
1092e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1093e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1094e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1095e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor
1096e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1097e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1098e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1099e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1100e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
11171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
11321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
11421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1148f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1149f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
11531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
12031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
12111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
12161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
12219d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
12289d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
12291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
12339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
12341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
12361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
12389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
12391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
12401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
12421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
12449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
12451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
12471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
12521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
12629d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1267c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
1268c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1269c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1270c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
12799d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1284c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1285c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1286c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1287c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
12969d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1301c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1302c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1303c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1304c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
13139d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1318c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
1319c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1320c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1321c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
13299d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                TypeSourceInfo *TInfo,
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
133388650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
13359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                               TInfo->getType().getAsOpaquePtr(),
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
133788650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
13621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
13671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
13711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
13751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
13771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1378828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1379828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1381828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1382828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1398036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1399036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1400036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1401036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
14081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
14121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
14141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
14221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
14701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
14741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1479865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1483f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1487f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1488f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
1489f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location,
1490f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1491f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1492f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location);
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1500f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1501f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1502d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1503f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
15114411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
15154411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
15164411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
15174411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
15184411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor      return getSema().ExprError();
15194411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor
15204411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
15214411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           move_arg(ConvertedArgs));
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1565865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
1566aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1569a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1570a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1571129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1573c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1574129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1576a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1577a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1579aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1580aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1581129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
1582129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            Name, MemberLoc, TemplateArgs);
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1585129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
15863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
15873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
15883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1589129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE,
1590aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1591129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1592129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1593129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1594129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1595c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1596129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1597129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
15983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
15993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
16003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
16011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1602aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1603aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1604c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1605c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
16063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
16071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
16171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
16331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                             RParenLoc));
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
16441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
16521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
16540da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
16561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
16651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
16701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
16721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
167643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
167743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
167843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
167943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
16801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
168243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
16831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
168543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
168643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
168743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
168843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
16891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
169043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
169143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
169209cc141c89a5e9f305c17d7a88298647df16ceddJohn McCall#define ABSTRACT_EXPR(Node, Parent)
169343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
169443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
169543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
169643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
169743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
169843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
16991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17005ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E));
170143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
17021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
170443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
170543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
17061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1708670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1709454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
171609cc141c89a5e9f305c17d7a88298647df16ceddJohn McCall#define ABSTRACT_EXPR(Node, Parent)
1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1718454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
17201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1723657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1724657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1725657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1726dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1728a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1729c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1730c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
17310979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
17320979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
17331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
173443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1736dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1738c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1739c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
1740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1741dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
17421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
1744c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
1745a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
1746c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
17511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
1752a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
1753a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1754a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1758a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
1759c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
1760c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
1764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
17657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
17667c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       NNS->getAsNamespace()));
17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
1768dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1769dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1770dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1772dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1773dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1775dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1776dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1777dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1778dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1780dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1781dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1782fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
1783124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
1784124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
1785d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1786d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
17871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1788dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1789dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1790dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1791dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
17941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1795edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   T);
1796dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1797dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1799dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
18001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
1801dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1802dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1803dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
18041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
180581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
1806dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 SourceLocation Loc,
1807dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 QualType ObjectType) {
180881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
180981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
181081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
181181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
181281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
181381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
181481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
181581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
181681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
18173e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
181881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
181981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
18201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
182181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
182281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
182381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
182481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
1825124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    QualType T = getDerived().TransformType(Name.getCXXNameType(),
1826124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
182781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
182881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
183081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
18311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
183281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
183381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
18341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
183681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
183781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
183881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
183981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
18401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
18413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
18423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
18437c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  SourceLocation Loc = getDerived().getBaseLocation();
18447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor
1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
18461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1848124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
1849124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
1850d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
18541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
18557c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
18581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1860d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1865d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
18671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1868f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
1869f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
1870d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
18731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1875124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
1876124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
18773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
1878d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1880d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1881dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
1882dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
1883d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1885ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
1886ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
1887ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
1888ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
1889ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
1890ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
1891d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1893d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
18941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
18957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
1896d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1897d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1899d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1900d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1901d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
19021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1903d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1904d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
19051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1906f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
1907f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
1908f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
1909d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1910d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1911d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
1912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
1913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
1914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
1916670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1917670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
19189f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
1919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1921833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
1922833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
1923a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
1924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1927788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
1928788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
1929788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
1930788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1931833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
1932833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
1933833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1934833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1935833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
1936670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
1938828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
1939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
1940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
1941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
1942833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
1944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
1945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
1946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
1947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
1948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
1949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
1950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
1951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
1952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
19531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1954670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1955a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
1956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
1957a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
1958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
1960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
1961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
1963833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1964670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1966670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1967833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
1968972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
1969972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
1970972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
1971788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
19727c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
1973833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
1974833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
1975828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
1976828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
1977828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
1978828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
1979828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
1980828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (E.isInvalid())
1981828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = NULL;
1982828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      else {
1983828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = E.takeAs<Expr>();
1984828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr->Retain();
1985828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      }
1986828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
1987828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
1988828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
1989833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
1990670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1992788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
1993788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
1994788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
1995788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
1996788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
1997788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
1998788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
1999788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
2000788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
2001788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
2002788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
2003788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
2004788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
2005670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
2006670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
20071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
2008670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
20091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2010833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
2011833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2012833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2013833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
2014833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2015833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
2016833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2017833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *ETaken = E.takeAs<Expr>();
2018828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    ETaken->Retain();
2019833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2020833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2021670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2023670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2027670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2028670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
20291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2030833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2031833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2032833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2033828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2034828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2035828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2036828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2037833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2038833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2039828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2040670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2041670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2043670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2044828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2045833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2046670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2047670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
20481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2049670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2050833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2051670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2052670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2058124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T,
2059124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2065a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
20664802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2068124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
20721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2077124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2078124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2080a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
20811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
20831bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
20861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2087124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
20901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2091a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2092577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2096124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2097124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2102124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2103124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21079f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
21101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
21161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2119124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualifiedTypeLoc T,
2120124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2121a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2123124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2124124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
21331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Result = SemaRef.Context.getQualifiedType(Result, Quals);
2135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.push<QualifiedTypeLoc>(Result);
2137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // No location information to preserve.
2139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2146a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// Ugly metaprogramming macros because I couldn't be bothered to make
2151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall// the equivalent template version work.
2152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TransformPointerLikeType(TypeClass) do { \
2153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType                                       \
2154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(TLB, TL.getPointeeLoc());   \
2155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (PointeeType.isNull())                                  \
2156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();                                       \
2157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();                            \
2159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||                        \
2160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != TL.getPointeeLoc().getType()) {         \
216185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().Rebuild##TypeClass(PointeeType,    \
216285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                          TL.getSigilLoc()); \
2163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())                                     \
2164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();                                     \
2165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }                                                          \
2166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result);    \
2168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setSigilLoc(TL.getSigilLoc());                        \
2169a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                             \
2170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;                                             \
2171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall} while(0)
2172a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2175124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      BuiltinTypeLoc T,
2176124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2177ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2178ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
2179ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
2180ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2181ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
2182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2186124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      ComplexTypeLoc T,
2187124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2194124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      PointerTypeLoc TL,
2195124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(PointerType);
2197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2198577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2202124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  BlockPointerTypeLoc TL,
2203124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  QualType ObjectType) {
2204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TransformPointerLikeType(BlockPointerType);
2205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
22061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
220785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
220885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
220985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
221085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
221185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
221285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
221385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2214124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ReferenceTypeLoc TL,
2215124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
221685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
221785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
221885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
221985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
222085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
222185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
222285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
222385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
222485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
222585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
222685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
222785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
222885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
222985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
223085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
223185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
223285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
223385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
223485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
223585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
223685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
223785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
223885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
223985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
224085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
224185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
224285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
224385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2244a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2245a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2247124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 LValueReferenceTypeLoc TL,
2248124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2249124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
22511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2252a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2254a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2255124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 RValueReferenceTypeLoc TL,
2256124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2257124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
22611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2263124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   MemberPointerTypeLoc TL,
2264124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2265a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2267a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2271a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2273a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
228185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
228285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
22931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2296124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ConstantArrayTypeLoc TL,
2297124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2306a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
230985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
231085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
23181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2319a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2331a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2332124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              IncompleteArrayTypeLoc TL,
2333124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              QualType ObjectType) {
2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2343a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
234485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
234585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2361124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   VariableArrayTypeLoc TL,
2362124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2363a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2368670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2369670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2370670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
238685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2403124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                             DependentSizedArrayTypeLoc TL,
2404124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2410670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2411670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
24121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2426a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
242885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
24331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2447124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      DependentSizedExtVectorTypeLoc TL,
2448124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2456670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2457670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2458670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2465eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2466eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2483a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2485a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2490124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     VectorTypeLoc TL,
2491124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2498a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2499a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
250082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
250182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson      T->isAltiVec(), T->isPixel());
2502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2503a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2504a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
25081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2509a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2514124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        ExtVectorTypeLoc TL,
2515124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2516a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2521a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2523a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
25331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
25371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
253821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
253921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
254021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
254121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
254221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
254321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
254421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
254521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
254621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
254721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
254821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
254921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
255021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
255121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
255221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
255321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
255421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
255521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
255621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
255721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
255821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
255921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
256021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
256121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<QualType> &PTypes,
256221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
25641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2565a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
257221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      assert(OldParm->getTypeSourceInfo()->getType() == T->getArgType(i));
257321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
257421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
257521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
257621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
258721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
25891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PTypes.push_back(NewType);
259121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PVars.push_back(NewParm);
2592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
25931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
259521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
259621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
259721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
259821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
259921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
260021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   FunctionProtoTypeLoc TL,
260121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   QualType ObjectType) {
260221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  FunctionProtoType *T = TL.getTypePtr();
260321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
260421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (ResultType.isNull())
260521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return QualType();
260621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
260721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  // Transform the parameters.
260821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
260921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
261021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
261121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return QualType();
261221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getTypeQuals());
2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
26251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2638124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 FunctionNoProtoTypeLoc TL,
2639124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 QualType ObjectType) {
2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2657ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2658ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2659124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 UnresolvedUsingTypeLoc TL,
2660124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2661ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
26627c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2663ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
2664ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
2665ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2666ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
2667ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2668ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
2669ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
2670ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
2671ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
2672ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2673ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
2674ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
2675ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2676ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
2677ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2678ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
2679ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
2680ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2683124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypedefTypeLoc TL,
2684124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
26877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
26887c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
2689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2708124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypeOfExprTypeLoc TL,
2709124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
2710670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
2711670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2713cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2719cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
27251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2727cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
2728cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2729cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2732577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2736124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     TypeOfTypeLoc TL,
2737124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2738cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
2739cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
2740cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
2741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2744cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
2745cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
27491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2751cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
2752cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2753cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2754cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2757577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2761124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       DecltypeTypeLoc TL,
2762124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2765670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
2766670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
27671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2769577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2770577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2778577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2785577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2786577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2789124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     RecordTypeLoc TL,
2790124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
2792577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
27937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
27947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
2795577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
2796577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2798a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2800a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
2801a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
2802a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2803a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2804a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
28051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2807a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2808a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2810577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2814124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   EnumTypeLoc TL,
2815124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
2817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
28187c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
28197c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
2820577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
2821577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2823a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2824a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2825a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
2826a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
2827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2828a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2829a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2830a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2831a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2835577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28367da2431c23ef1ee8acb114e39692246e1801afc2John McCall
28377da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
2838a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2839124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                         ElaboratedTypeLoc TL,
2840124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
2841a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedType *T = TL.getTypePtr();
2842a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2843a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this should be a nested type.
28447da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
28457da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
28467da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
28471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2848a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2849a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2850a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
2851a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2852a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2853a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2854a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2855a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2856a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2857a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
28607da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
28611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28623cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
28633cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
28643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
28653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         InjectedClassNameTypeLoc TL,
28663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         QualType ObjectType) {
28673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
28683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
28693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
28703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
28713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
28723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
28733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
28743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
28753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
28761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2878577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2879a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
2880124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                TemplateTypeParmTypeLoc TL,
2881124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                QualType ObjectType) {
2882a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
2883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
288649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
2888124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         SubstTemplateTypeParmTypeLoc TL,
2889124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         QualType ObjectType) {
2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
289149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
289249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
289349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
2894833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2895833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
2896833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2897833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
2898833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2900833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
2901833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
2902833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
2903833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
2904833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2905828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
2906828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2907828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
2908828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
2909828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
2910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
2912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
2913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
2914833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
2915833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2916833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
2918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
2919dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
2920dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor
2921dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
2922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
2924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
2925833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
2926833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
2927833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
29281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
2929dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
2930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
2931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
29321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2933d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
2934d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
2935d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
2936d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
2937d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
2938d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
2939d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
2940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2941d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
2942d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
29431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
2945833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
2947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
2948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
2949d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
29501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
2952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
2953833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
2954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
2955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
2956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
2957833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
2958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
2959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
29601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
2962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2965a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2966a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2967124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualifiedNameTypeLoc TL,
2968124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2969a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameType *T = TL.getTypePtr();
2970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2972124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                SourceRange(),
2973124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                ObjectType);
2974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
29761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2978577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
29801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2981a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2983a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
2984a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Named != T->getNamedType()) {
2985a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2986a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2987a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2988a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
2992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2993a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2997a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2998124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       TypenameTypeLoc TL,
2999124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3000a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameType *T = TL.getTypePtr();
3001833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3002833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /* FIXME: preserve source information better than this */
3003833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceRange SR(TL.getNameLoc());
3004833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3005577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
3006124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR,
3007edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                ObjectType);
3008577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
3009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3011a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result;
3012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType NewTemplateId
3015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
3016577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
3017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
30181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3019577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
3020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
3021577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
3022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
30231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
3025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
3026833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR);
3027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3028a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3031a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
3032a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3034a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3038a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3040124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ObjCInterfaceTypeLoc TL,
3041124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
304254e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCInterfaceType unimplemented");
304354e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
3044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3049124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjCObjectPointerTypeLoc TL,
3050124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
305154e14c4db764c0636160d26c5bbf491637c83a76John McCall  assert(false && "TransformObjCObjectPointerType unimplemented");
305254e14c4db764c0636160d26c5bbf491637c83a76John McCall  return QualType();
305324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
305424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
305643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
305743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
305843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
305943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
30611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
306243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
306343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
306443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
306543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
306643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
306743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
306843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
306943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
307043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
307143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
307343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
307443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
307543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
307643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
307743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
307843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
307943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
308043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
30811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
308343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
308443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
30851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
308643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
308743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
30881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
308943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
309043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
309143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
309243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
309343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
309443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
30951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
309643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
309743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
30981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3099264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  OwningExprResult LHS(SemaRef), RHS(SemaRef);
3100264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3101264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3102264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3104264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3105264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3106264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3107264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
31081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3109264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3110264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3111264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3112264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3113264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
31141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
311543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
311643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
311743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
311843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
311943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
312043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
312143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
312243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
312343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
312443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
312743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
312843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
312943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
313243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
313343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
313443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
313543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
313643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
313843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
313943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
314043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
314143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
314343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
314443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
314543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
314643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
314843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
314943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
31501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
315143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
315243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
315343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
315543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
315643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
315743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
315843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
315943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
316143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
31621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
31631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
316443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
31658cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  OwningExprResult Cond(SemaRef);
31668cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
31678cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
31688cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    ConditionVar
31698cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
3170aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3171aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3172aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
31738cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
31748cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
317599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
31768cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
31778cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor
317899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
317999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
318099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
31818cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor
31825ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
318543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
318643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
318743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
318943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
319043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
319143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
319243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
319543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
319699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
319743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
319843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
31991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
320199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
320299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Then),
32031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
320443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
320543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
320643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
320743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
320943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
3210d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  OwningExprResult Cond(SemaRef);
3211d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3212d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3213d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    ConditionVar
3214d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3215aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3216aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3217aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
3218d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3219d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
322099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3221d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
322299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
322399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
322499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
322599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
32261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32275ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
322899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
322943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
323099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(FullCond,
323199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                                                ConditionVar);
323243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
323343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
323643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
323743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
323843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
324043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
324143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
324243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
324343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
324543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
324643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
32471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
324843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
32495656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  OwningExprResult Cond(SemaRef);
32505656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
32515656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
32525656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    ConditionVar
32535656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
3254aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3255aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3256aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
32575656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
32585656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
325999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
32605656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
326199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
326299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
326399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
326499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
32651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32665ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
32671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
326843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
326943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
327043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
327143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
327343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
327443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
327599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
327643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
32771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
32781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
327999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, ConditionVar,
328099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                       move(Body));
328143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
32821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
328343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
328443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
328543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
328643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
328743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
328843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
328943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
329243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
329343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
329443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
32951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
329743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
32991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
330143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
330243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
330443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
330643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
330743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
330943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
331043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
331143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
331243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
33131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
331599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningExprResult Cond(SemaRef);
331699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
331799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
331899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    ConditionVar
331999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
3320aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3321aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3322aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
332399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
332499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
332599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
332699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
332799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor
332899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
332999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
333099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
33311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
333243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
333343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
333443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
333543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
33361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
333743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
333843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
333943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
334043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
33411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
334243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
334343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
334443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
334543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
334643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
33471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
33481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
334943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
33505ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson                                     move(Init), getSema().MakeFullExpr(Cond),
335199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                     ConditionVar,
33525ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson                                     getSema().MakeFullExpr(Inc),
335343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
335443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
335543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
335643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
33571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
33581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
335943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
336143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
336343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
336443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
336543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
336743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
336843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
336943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
33701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
337143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
337243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
33731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
337443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
337543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
337643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
337743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
337843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
337943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
338043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
33821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
338343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
338543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
338643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
33881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
338943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
33901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
339143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
339243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
33981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
339943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
340343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
340643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
3410aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
3411aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                         *D);
341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
34141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
34171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
341943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
34321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3438703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3439703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema());
3440703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema());
3441ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 4> Names;
3442a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
3443703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningExprResult AsmString(SemaRef);
3444703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema());
3445703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3446703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  bool ExprsChanged = false;
3447703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3448703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the outputs.
3449703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
3450ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getOutputIdentifier(I));
3451a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
3452703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3453703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain());
3454703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3455703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the output expr.
3456703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *OutputExpr = S->getOutputExpr(I);
3457703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(OutputExpr);
3458703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3459703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3460703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3461703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != OutputExpr;
3462703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3463703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Exprs.push_back(Result.takeAs<Expr>());
3464703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3465703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3466703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the inputs.
3467703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
3468ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getInputIdentifier(I));
3469a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
3470703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3471703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain());
3472703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3473703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the input expr.
3474703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *InputExpr = S->getInputExpr(I);
3475703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(InputExpr);
3476703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3477703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3478703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3479703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != InputExpr;
3480703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3481703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Exprs.push_back(Result.takeAs<Expr>());
3482703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3483703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3484703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
3485703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    return SemaRef.Owned(S->Retain());
3486703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3487703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the clobbers.
3488703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
3489703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Clobbers.push_back(S->getClobber(I)->Retain());
3490703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3491703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // No need to transform the asm string literal.
3492703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  AsmString = SemaRef.Owned(S->getAsmString());
3493703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3494703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
3495703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isSimple(),
3496703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isVolatile(),
3497703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumOutputs(),
3498703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumInputs(),
3499a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson                                     Names.data(),
3500703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Constraints),
3501703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Exprs),
3502703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move(AsmString),
3503703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Clobbers),
3504703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getRParenLoc(),
3505703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isMSAsm());
350643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
350743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
350843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
350943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
351043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
351243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
351343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @try statement");
35141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
351543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
351843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
352043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
352143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @catch statement");
352243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
352343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
352643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
352843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
352943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @finally statement");
35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
353143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
353343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
353443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
353643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
353743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @throw statement");
35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
353943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
354143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
354243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
354343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
354543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
354643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @synchronized statement");
35471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
354843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
354943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
355043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
355143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
355243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
35531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
355443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
355543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C for-each statement");
35561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
355743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
355843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
355943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
356043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
356143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
356243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
356343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
356443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
356543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
356643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
356743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
356843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
356943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
357043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
357143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
357243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
35731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
357543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
3576a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                            ExceptionDecl->getTypeSourceInfo(),
357743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
357843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
357943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
358043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
358143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
358243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
358343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
358443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
358543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
358643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
35871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
358843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
358943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
359043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
359143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
359243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
359343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
359443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
35951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
359643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
359743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
359843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
35991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
360043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
360143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
360243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
360343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
360443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
360643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
360743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
360843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
360943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
361143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
361243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
361343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
361643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
361743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
361843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
36191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
362043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
362143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
362243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
36231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
362543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
362643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
36271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
362943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
363043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
36311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
363243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
363343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
36341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
363543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
363743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
3639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
36401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3642454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
36431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
36441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
36451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3648454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
3649a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
3650a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
3651a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3652edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                       E->getQualifierRange());
3653a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
3654a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
3655a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3656dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3657dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
36587c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
36597c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getDecl()));
3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3663a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3664a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
3665a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
3666dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      !E->hasExplicitTemplateArgumentList()) {
36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3668dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
3669dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
3670dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
3671a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3672dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return SemaRef.Owned(E->Retain());
3673a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
3674dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3675dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
3676dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  if (E->hasExplicitTemplateArgumentList()) {
3677dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
3678dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
3679dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
3680dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3681dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TemplateArgumentLoc Loc;
3682dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
3683dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall        return SemaRef.ExprError();
3684dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TransArgs.addArgument(Loc);
3685dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    }
3686dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
3687dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
3688a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
3689dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                         ND, E->getLocation(), TemplateArgs);
3690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
36911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3694454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
36951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
36971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3700454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
37011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3706454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
37111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3712454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
37131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3718454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
37191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3724454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
37301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
37371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3738454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
3739454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
37441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3753454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
3755a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
37565557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
3757a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
37585ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37615ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
37631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37645ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
37651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
37701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
37751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
37791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
37831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
37901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3791454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
38051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
3808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
38131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3814454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
38321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
38411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
38431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
38521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3853454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
385883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
385983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
38601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
386183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3862edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  E->getQualifierRange());
3863c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
386483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
386583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
38661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3867f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
38687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
38697c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getMemberDecl()));
3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
387583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
38768a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
38771f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson      !E->hasExplicitTemplateArgumentList()) {
38781f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson
38791f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
38801f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
38811f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
38821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38831f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3885d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
38868a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  if (E->hasExplicitTemplateArgumentList()) {
3887d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
3888d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
38898a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3890d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
3891d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
38928a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
3893d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
38948a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
38958a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
38968a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor
3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3901c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
3902c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
3903c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
3904c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
3905c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
3906c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
390983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
391083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
39128a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
3913d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                        (E->hasExplicitTemplateArgumentList()
3914d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
3915c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3920454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
39321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
39381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
3941454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
3942454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3947454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
39651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
396747e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
39681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
396947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
39741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3975454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
3976a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
3977a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
39786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
39821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3983454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
39849d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
39859d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
39881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
39911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39929d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
39939d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
39949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
39971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3998a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
39996eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
40049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
40061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
40099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            NewT,
4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4016454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
401742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
401842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
401942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
402042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return SemaRef.ExprError();
40211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
402742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      OldT == NewT &&
4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
40291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
40311d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // Note: the expression type doesn't necessarily match the
40321d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // type-as-written, but that's okay, because it should always be
40331d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // derivable from the initializer.
40341d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
403542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4042454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
40491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
40521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
40601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4061454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
40631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
40731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
40751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
40761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
4078e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4083454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
40851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
408643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
409143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
41031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
41081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
41111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
41161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
41181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
41221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
41261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
41341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
41381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
41431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
4152454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
41535557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
41545557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
41555557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
41565557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4170454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
41731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
41901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
4193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4197454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
42041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4221454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4227c86a6e988184867b09aa17a619402d0e81d0fda0Douglas GregorSema::OwningExprResult
4228454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4245454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
4247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
4252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
4253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
42541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
42631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4271454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
42881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4297454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
42981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4303454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4304668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
4305668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
4306668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
4307668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
4308668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
4309668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4310668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4311668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4312668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
4313668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
4314668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4315668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4316668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
4317668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4318668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4319668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      return SemaRef.ExprError();
4320668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4321668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
4322668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
4323668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
4324668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
4325668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4326668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
4327668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4328668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4329668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
43306eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      if (getDerived().DropCallArgument(E->getArg(I)))
43316eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor        break;
43326eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
4333668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4334668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4335668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        return SemaRef.ExprError();
4336668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4337668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      // FIXME: Poor source location information.
4338668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      SourceLocation FakeCommaLoc
4339668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        = SemaRef.PP.getLocForEndOfToken(
4340668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4341668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      FakeCommaLocs.push_back(FakeCommaLoc);
4342668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      Args.push_back(Arg.release());
4343668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    }
4344668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4345668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc,
4346668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
4347668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        FakeCommaLocs.data(),
4348668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
4349668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4350668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4351668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4352668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
4353668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4354668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
4355668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
4356668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
4357668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
4358668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4359668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
4360668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
4361668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4362668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4363668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4364668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4365668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4366668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4367668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4368668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4373454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
43871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
43881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
43921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4399454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
4400454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
44041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4405454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
44069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
44079d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
44101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
44131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44149d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
44159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
44169d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4420a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
44216eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
44269d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
44281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
44311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
44381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
44409d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                              NewT,
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
44481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4449454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
4450454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4455454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
4456454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
4462454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
4463454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4468454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
4469454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
4475454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
44769d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
44779d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
44801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44819d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
44829d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
44839d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4487a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
44886eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
44939d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
44951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
4498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
4499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
45009d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                   NewT,
4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
4503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
4504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4508454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
45151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
4518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
45191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
4522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
4523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
4524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
45251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
4527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
4528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
45291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
45311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
45381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4548454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
45491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
4555454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
45561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4561454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
45631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
45711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4572828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
4573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4577454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
4578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4591454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
45921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
45937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
45947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
459853cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
4599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
4600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
46011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4602036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
4603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4607454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
4608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
46161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
4619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4626454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
4627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
4628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
4631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
4634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
465043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
46621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
46631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
46641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
46657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
46667c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
46671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
46681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
46691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
46701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
46711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
46721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
46731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
46747c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
46757c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
46761af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
46771af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
46781af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
46791af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
46801af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
46811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
46821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
46837c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
46847c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
46851af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
46861af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
46871af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
46881af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
46921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
46931af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
46941af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
46951af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
46961af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
46971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
46981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
46991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
47001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
47011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
47021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
47031af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
47041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
47051af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47075b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
47085b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
47095b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
47105b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
47115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
47125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
47135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
47145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
47155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
47165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
47175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
47185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      ArraySize
47195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
47205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  ConsArrayT->getSize(),
47215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  SemaRef.Context.getSizeType(),
47225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  /*FIXME:*/E->getLocStart()));
47235b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
47245b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
47255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
47265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
47275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
47285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
47295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
47305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
47315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
47441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4749454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47541af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
47551af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
47561af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
47571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
47587c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
47597c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
47601af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
47611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
47621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
47631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
47651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
47661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
47671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
47681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
47691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
47701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
47711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
47721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4782a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
4783454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
4784a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4785a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
4786a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
47871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4788a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  Sema::TypeTy *ObjectTypePtr = 0;
4789a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
4790a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4791a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
4792a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
4793a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
4794a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
4795a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
4796a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    return SemaRef.ExprError();
4797a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor
4798a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr);
4799a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
4800a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4801b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor                                                E->getQualifierRange(),
4802a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                ObjectType);
4803a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
4804a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
48051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4806a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
4807a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
4808a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
4809a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
4810a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
4811a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
4812a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
4813a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
4814a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
4815a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
4816a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
4817a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
4818a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
4819a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
4820a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    CXXScopeSpec SS;
4821a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (Qualifier) {
4822a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setScopeRep(Qualifier);
4823a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setRange(E->getQualifierRange());
4824a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    }
4825a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor
4826a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(),
4827a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
4828a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
4829a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
4830a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
4831a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
4832a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
4833a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
4834a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor
4835a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
4836a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
4837a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
4838a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
483926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
484026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
484126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
4842a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
4843a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                               ObjectType);
484426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
4845a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
4846a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
484726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
4848a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4849a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
4850a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
4851a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
485226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getQualifierRange(),
485326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
485426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
4855fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
4856a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
4857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
4860a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
4861ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
4862454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
4863f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
4864f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4865f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
4866f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
4867f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4868f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
4869f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
4870f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
48717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
48727c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
48737c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
48749f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
48759f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
48769f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
48779f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
48789f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
48799f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
48809f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
48819f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
4882f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4883f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
4884f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
4885f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
4886f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
4887f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
4888f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
4889f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
4890f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
4891f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4892f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
4893f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4894f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4895f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
4896f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
4897f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
4898f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4899f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
4900f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
4901f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
4902f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
4903f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
4904edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                    Old->getQualifierRange());
4905f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
4906f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4907f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4908f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
4909f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
4910f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4911f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4912f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
4913f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
4914f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
4915f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4916f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
4917f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
4918f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
4919f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
4920f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
4921f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
4922f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
4923f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
4924f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
4925f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
4926f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
4927f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
4928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4932454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
4933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
49341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
4936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
4941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
49421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
4944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
4945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
49461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
4949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
4950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
4951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
4952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4956865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
4957454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  DependentScopeDeclRefExpr *E) {
4958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
4959f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4960edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                E->getQualifierRange());
4961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
4962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
496581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
496681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
496781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
49681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4969f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
4970f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
4971f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
4972f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        Name == E->getDeclName())
4973f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
49741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4975f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
4976f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
4977f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         Name, E->getLocation(),
4978f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
4979f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
4980d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
4981d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4983d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
4984d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4986d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
4987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4989f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
4990f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
4991f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       Name, E->getLocation(),
4992f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
4993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4997454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
4998321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
4999321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
5000321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
5001321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5002321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
5003321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
50127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
50137c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
50191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
5021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
50226eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
50236eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
50246eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
50256eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
50266eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
5027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
50301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
5033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
5038c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
50391af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
50401af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
5041c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
5043c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
50441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50454411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
50464411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
5047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
5048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
5051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
50525132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
50535132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
5054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5056454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
50575132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5060eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// \brief Transform a C++ reference-binding expression.
5061eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson///
5062eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// Since CXXBindReferenceExpr nodes are implicitly generated, we just
5063eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// transform the subexpression and return that.
5064eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssontemplate<typename Derived>
5065eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonSema::OwningExprResult
5066eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonTreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
5067eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  return getDerived().TransformExpr(E->getSubExpr());
5068eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
5069eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
50701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
5071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
50735132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
50745132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
50785132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
50795132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5085454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXTemporaryObjectExpr *E) {
5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
50937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                  getDerived().TransformDecl(E->getLocStart(),
50947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
51011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
5103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
510491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
510591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      ArgumentChanged = true;
510691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      break;
510791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    }
510891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor
5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
5115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
512091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
512191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
512291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
5123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
512491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
51251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
51301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
5131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
5132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
5134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
5135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
5137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
5138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5144454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
5147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
5153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
5155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
5163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
5174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
5175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
5177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
5178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5182865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
5183454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXDependentScopeMemberExpr *E) {
5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
5185aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
5186aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
5187aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5188aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
5189aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
5190aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
5191aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
5192aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5193aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
51941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5195aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
5196aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Sema::TypeTy *ObjectTy = 0;
5197d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
5198aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5199aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
5200a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
5201d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
5202d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
5203aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5204aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5205aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
5206aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
5207aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5208aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5209aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
5210aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
5211aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5212aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
52131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52146cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
52156cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
5216c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
52176cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
52186cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
52196cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5221a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
5222a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
5223a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5224a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
5225aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
5226aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
5227a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
5228a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
5229a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
52301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
5232dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
5233aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            ObjectType);
523481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
523581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
52361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5237aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
52383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
52393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
52403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
5241aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
5242aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
52433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
52443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
52453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
52461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
52471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5248865d447ac6a4721ab58e898d014a21f2eff74b06John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5249aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
52503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
52513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
52523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
52533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
5254129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
52553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
52563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
5257129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
52583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
52593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
5260d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
52613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5262d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5263d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
52643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
5265d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
52663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
52671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5268865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5269aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
5270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
5271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
5272a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
5273a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
52743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
5275129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     Name,
5276129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     E->getMemberLoc(),
5277129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
5278129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
5279129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5280129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
5281129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult
5282454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5283129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
5284aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
5285aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5286aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
5287aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
5288aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5289aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5290aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5291aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5292aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5293aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5294129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5295129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5296129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5297129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5298129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5299edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  Old->getQualifierRange());
5300129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5301129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      return SemaRef.ExprError();
5302129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5303129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5304129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(),
5305129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5306129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5307129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5308129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5309129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
53107c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
53117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
53127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
53139f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
53149f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
53159f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
53169f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
53179f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
53189f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
53199f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
53209f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5321129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5322129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5323129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5324129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5325129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5326129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5327129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5328129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5329129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5330129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5331129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5332129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5333129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5334129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5335129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5336129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5337129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5338129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5339129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5340129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5341129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5342129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5343129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5344129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        return SemaRef.ExprError();
5345129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5346129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5347129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5348c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
5349c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5350c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5351c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5352c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5353c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5354129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5355129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  return getDerived().RebuildUnresolvedMemberExpr(move(Base),
5356aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
5357129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
5358129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
5359129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
5360129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
5361c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
5362129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
5363129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
5364129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
5365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5369454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
53701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
53731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
53741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5375454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
5376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
5377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
5378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
5379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
5380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
53811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
53841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
5388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
5389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5393454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
5394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
53961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
53991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5401454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
54021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5407454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
54081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ObjCProtocolDecl *Protocol
5409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
54107c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
54117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            E->getProtocol()));
5412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
5413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
54171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
54181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
5420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
5421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
5422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
5423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
54241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5429454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
5430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
54321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5437454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
5438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
54401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
544509105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
5446454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
5447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
54491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5454454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
5455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
54571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5462454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
5463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
54651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5470454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
5471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
5473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
5474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
5475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
5476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
54771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
5479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
5480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
54811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
54841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
54851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
5487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
5488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
5489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
54921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5493454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
5494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
54961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
55001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5501454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
5502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
5503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
55041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
5508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
5509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
5510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
55111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
551285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
551385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
551485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
5515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
5516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
55181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
551985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
552085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
552185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
5522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
5523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
55251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
55261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
552785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
552885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
552985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
553085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
553185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
5532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
55341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
55351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
553685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
553785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
553885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
55390953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
554085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
5541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
55441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
554585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType,
554685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     SourceLocation Sigil) {
554785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil,
5548a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                  getDerived().getBaseEntity());
5549a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
5553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
5554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
5555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
5556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
5557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
5558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
5559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
5560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
5561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
5562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
55631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
55651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
55661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
55671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
5568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
5569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
5570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
5571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
5572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
5573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
5574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
5575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
55761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
55781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
5579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
55801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
5581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
55821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
55841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
55851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
5586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
5587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
558885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
558985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
55901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
559185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
5592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
55951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
55961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
5597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
559885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
559985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
56001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
560185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
5602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
56031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
56051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
56061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
5607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
5609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
5610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
56111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
56171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
56181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
5619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
5620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
5621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
5622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
56231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
5624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
5625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
5626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
563082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       unsigned NumElements,
563182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       bool IsAltiVec, bool IsPixel) {
5632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
563382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  return SemaRef.Context.getVectorType(ElementType, NumElements,
563482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       IsAltiVec, IsPixel);
5635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
56361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
5639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
5640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
5641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
5642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
5643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
56441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
5645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
5646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
5647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
5648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
56491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
56511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
56521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
5653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
5654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
5655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
5656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
56571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
56601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
5661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
56621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
5663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
56641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
5665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
5666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
5667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
5668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
56691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
5672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
5673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
5674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
5675a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
5676ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
5677ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
5678ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
5679ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5680ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
5681ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
5682ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
5683ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
5684ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
5685ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5686ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
5687ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
5688ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
5689ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5690ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
5691ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
5692ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
5693ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
5694ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
5695ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5696ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
5697ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
5698ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
5699ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
5701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
5702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
5706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
5707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
5711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
5712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
5713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
5715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
5716833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
5717833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
5718d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
5719d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
5720577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
57211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5722dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5723dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5726a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
5727c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
5728d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
5729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
5730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
5731dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
5732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
5733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
57341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
5735495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
5736c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
5737c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
573846646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
5739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5740dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5741dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5742dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5744dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
5746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
5748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
5749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
5750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
5751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
5753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
5754edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   QualType T) {
5755edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor  if (T->isDependentType() || T->isRecordType() ||
5756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
5757a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
5758dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5759dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
5760dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
57611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5762dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5763dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
5764dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
57651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5766d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
57671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5768d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5769d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
5770d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
57711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
5772d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
5773d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
5774d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
5775d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
57761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
5777d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
57783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
57793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
5780d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
5781d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
57821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
5783014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
5784014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
57853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
57863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
57873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
5788014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor                                              Name,
5789a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
5790a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
57913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
5792d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
57931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5795ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
5796ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5797ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
5798ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
5799ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
5800ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
5801ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
5802ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
5803ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
5804ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
5805ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
5806ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return getSema().ActOnDependentTemplateName(
5807ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
5808ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              SS,
5809ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              Name,
5810a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
5811a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
5812ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor           .template getAsVal<TemplateName>();
5813ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
5814ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor
5815ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
58161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
5819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
5820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
5821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
5822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
5823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
5824ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
5825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
58261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
5828f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
5829f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    if (!FirstExpr->getType()->isOverloadableType() &&
5830f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl        !SecondExpr->getType()->isOverloadableType())
5831f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
5832ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                 CalleeExpr->getLocStart(),
5833f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       move(Second), OpLoc);
58341a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
58351a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
58361a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
5837f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  } else if (SecondExpr == 0 || isPostIncDec) {
5838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
5839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
5840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
58411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
5842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
58431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
58471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
5848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
5849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
5850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
5851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
58521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
5853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
5855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
58561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
5858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
5859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
5860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
5861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
58621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
5864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
58656e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
58661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5867ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
5868ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
5869ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
5870ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
5871ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
58726e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
5873ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
58746e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.addDecl(cast<DeclRefExpr>(CalleeExpr)->getDecl());
5875ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
58761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
5878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
5879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
58801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
5882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
58831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
5884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
58871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5888f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
5889ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
5890ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
5891ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(First),
5892ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(Second));
5893f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
5894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
58951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
5896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
58971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
5898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
5900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
59011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
5903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
59041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
5905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
590726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
590826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorSema::OwningExprResult
590926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(ExprArg Base,
591026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
591126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
591226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                 NestedNameSpecifier *Qualifier,
591326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceRange QualifierRange,
591426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
591526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
5916fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
5917a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
591826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  CXXScopeSpec SS;
591926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (Qualifier) {
592026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setRange(QualifierRange);
592126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setScopeRep(Qualifier);
592226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
592326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
592426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  Expr *BaseE = (Expr *)Base.get();
592526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  QualType BaseType = BaseE->getType();
5926a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (BaseE->isTypeDependent() || Destroyed.getIdentifier() ||
592726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
592826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (isArrow && BaseType->getAs<PointerType>() &&
5929bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
5930bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
593126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
593226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    return SemaRef.BuildPseudoDestructorExpr(move(Base), OperatorLoc,
593326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
5934fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
5935a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
593626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
593726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
593826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
5939a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
594026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  DeclarationName Name
594126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXDestructorName(
594226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                SemaRef.Context.getCanonicalType(DestroyedType->getType()));
594326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
594426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
594526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
594626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
594726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
594826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
5949a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            Name, Destroyed.getLocation(),
595026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
595126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
595226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
5953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
5954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
5956