TreeTransform.h revision 586596fd7f7a336a2847b300c80614dcf39ab6d5
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;
99c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
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  }
184c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
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.
204c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  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  ///
211c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  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.
246c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
247c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    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  ///
253c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// 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.
259c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
260c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
2616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
262c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
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
333c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL,
334124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType);
33585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
336c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType
337dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
338dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
34043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
341d8383d45e41ba2316610e5d638d2872e37b67cfbZhongxing Xu  OwningExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
34443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
346454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult Transform##Node(Node *E);
3474bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#define ABSTRACT(Stmt)
3484bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
36085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
37085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
37185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
37285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
37985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
38085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
40485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
40585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
41485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
41585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
44482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
44582287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    bool IsAltiVec, bool IsPixel);
4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
476ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// \brief Rebuild an unresolved typename type, given the decl that
477ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// the UnresolvedUsingTypenameDecl was transformed to.
478ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType RebuildUnresolvedUsingType(Decl *D);
479ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4947da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4957da2431c23ef1ee8acb114e39692246e1801afc2John McCall  /// \brief Build a new elaborated type.
4967da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
4977da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return SemaRef.Context.getElaboratedType(T, Tag);
4987da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
4991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
523833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
524d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &Args);
5251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, builds a new QualifiedNameType type from the
5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// nested-name-specifier and the named type. Subclasses may override
530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
5331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
537c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// By default, builds a new DependentNameType type from the
5384033642464e8ba0982f88f34cffad808d247b393Douglas Gregor  /// nested-name-specifier
5391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and the given type. Subclasses may override this routine to provide
540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
5414a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
5424a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    NestedNameSpecifier *NNS, QualType T) {
543ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor    if (NNS->isDependent()) {
5444033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      // If the name is still dependent, just build a new dependent name type.
545ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor      CXXScopeSpec SS;
546ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor      SS.setScopeRep(NNS);
547ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
5484a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor        return SemaRef.Context.getDependentNameType(Keyword, NNS,
549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
550ae6288981b77d6230bf62055d3bb6380580aa1e8Douglas Gregor    }
551c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5524a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor    // FIXME: Handle elaborated-type-specifiers separately.
553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
5591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// (or qualified name type). Subclasses may override this routine to provide
560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
561c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
5624a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    NestedNameSpecifier *NNS,
5634a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    const IdentifierInfo *Id,
5644a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    SourceRange SR) {
5654033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    CXXScopeSpec SS;
5664033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SS.setScopeRep(NNS);
567c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5684033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (NNS->isDependent()) {
5694033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      // If the name is still dependent, just build a new dependent name type.
5704033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
5714033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return SemaRef.Context.getDependentNameType(Keyword, NNS, Id);
5724033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
5734033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
5744033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    TagDecl::TagKind Kind = TagDecl::TK_enum;
5754033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    switch (Keyword) {
5764033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case ETK_None:
577107de90451b7f7a7749380a9d017ff1bafb6b407Douglas Gregor        // Fall through.
5784033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case ETK_Typename:
579107de90451b7f7a7749380a9d017ff1bafb6b407Douglas Gregor        return SemaRef.CheckTypenameType(Keyword, NNS, *Id, SR);
580c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5814033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case ETK_Class: Kind = TagDecl::TK_class; break;
5824033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case ETK_Struct: Kind = TagDecl::TK_struct; break;
5834033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case ETK_Union: Kind = TagDecl::TK_union; break;
5844033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case ETK_Enum: Kind = TagDecl::TK_enum; break;
5854033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
586c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5874033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // We had a dependent elaborated-type-specifier that as been transformed
5884033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // into a non-dependent elaborated-type-specifier. Find the tag we're
5894033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // referring to.
5904033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    LookupResult Result(SemaRef, Id, SR.getEnd(), Sema::LookupTagName);
5914033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
5924033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!DC)
5934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
5944033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
5954033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    TagDecl *Tag = 0;
5964033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SemaRef.LookupQualifiedName(Result, DC);
5974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    switch (Result.getResultKind()) {
5984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFound:
5994033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFoundInCurrentInstantiation:
6004033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
601c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6024033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Found:
6034033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        Tag = Result.getAsSingle<TagDecl>();
6044033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
605c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6064033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundOverloaded:
6074033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundUnresolvedValue:
6084033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        llvm_unreachable("Tag lookup cannot find non-tags");
6094033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
610c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6114033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Ambiguous:
6124033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        // Let the LookupResult structure handle ambiguities.
6134033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
6144033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6154033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!Tag) {
6171eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor      // FIXME: Would be nice to highlight just the source range.
6184033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(SR.getEnd(), diag::err_not_tag_in_scope)
6191eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor        << Kind << Id << DC;
6204033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
622c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6234033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // FIXME: Terrible location information
6244033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, SR.getEnd(), *Id)) {
6254033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(SR.getBegin(), diag::err_use_with_wrong_tag) << Id;
6264033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
6274033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6284033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6294033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6304033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // Build the elaborated-type-specifier type.
6314033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    QualType T = SemaRef.Context.getTypeDeclType(Tag);
6324033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    T = SemaRef.Context.getQualifiedNameType(NNS, T);
6334033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    return SemaRef.Context.getElaboratedType(T, Kind);
634dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
6351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
636dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
637dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
638dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
639dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
640dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
641dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
642dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
643dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
644a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
645c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
646c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
647dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
648dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
649dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
650dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
651dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
652dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
653dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
654dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
655dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
656dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
657dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
658dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
659dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
660dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
661dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
662dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
663dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
664dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
665dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
666dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
667edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  QualType T);
668d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
669d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
670d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
671d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
672d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
673d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
674d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
675d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
676d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
677d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
678d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
679d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
680d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
681d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
682d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
683d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
684d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
685d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
686d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
6873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
6883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
690ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
691ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
692ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
693ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
694ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
695ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
696ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
697ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
698ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
699ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
700c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
7221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
761586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::ExprArg Cond,
762c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                 VarDecl *CondVar, StmtArg Then,
76399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 SourceLocation ElseLoc, StmtArg Else) {
764586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    if (Cond.get()) {
765586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      // Convert the condition to a boolean value.
766586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      Cond = getSema().ActOnBooleanCondition(0, IfLoc, move(Cond));
767586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      if (Cond.isInvalid())
768586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor        return getSema().StmtError();
769586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    }
770586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor
771586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
772586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    return getSema().ActOnIfStmt(IfLoc, FullCond, DeclPtrTy::make(CondVar),
77399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 move(Then), ElseLoc, move(Else));
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch 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.
780586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
781586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          Sema::ExprArg Cond,
78299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                          VarDecl *CondVar) {
783586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, move(Cond),
784586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                            DeclPtrTy::make(CondVar));
78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
80043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
802586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                    Sema::ExprArg Cond,
80399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
805586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    if (Cond.get()) {
806586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      // Convert the condition to a boolean value.
807586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      Cond = getSema().ActOnBooleanCondition(0, WhileLoc, move(Cond));
808586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      if (Cond.isInvalid())
809586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor        return getSema().StmtError();
810586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    }
811586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor
812586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
813586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, FullCond,
814586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                    DeclPtrTy::make(CondVar), move(Body));
81543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
81843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
81943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
82043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
82143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
82243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
82343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
82443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
82543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
8261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
82743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
82843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
82943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
83043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
83143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
83243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
83343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
8341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
836586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                  StmtArg Init, Sema::ExprArg Cond,
83799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
839586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    if (Cond.get()) {
840586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      // Convert the condition to a boolean value.
841586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      Cond = getSema().ActOnBooleanCondition(0, ForLoc, move(Cond));
842586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      if (Cond.isInvalid())
843586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor        return getSema().StmtError();
844586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    }
845586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor
846586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
847586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), FullCond,
84899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  DeclPtrTy::make(CondVar),
84999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  Inc, RParenLoc, move(Body));
85043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
85343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
85443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
85543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
85643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
85743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
85843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
85943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
86043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
86143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
86243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
86343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
86443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
86543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
86643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
86743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
86843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
86943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
87043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
87243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
87343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
87443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
87543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
87643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
87743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
8781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
87943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
88043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
88243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
88343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
88443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
88543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
88643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
8871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
88843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
88943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
89043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
89143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
89243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
89343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
89443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
896703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
897703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
898703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
899703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
900703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc,
901703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
902703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
903703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
904703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
905ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
906703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
907703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
908703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  ExprArg AsmString,
909703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
910703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
911703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
912c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
913703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
914703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  move(Exprs), move(AsmString), move(Clobbers),
915703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
916703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
9174dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
9184dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @try statement.
9194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
9204dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9214dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9224dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
9234dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        StmtArg TryBody,
9248f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                        MultiStmtArg CatchStmts,
9254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        StmtArg Finally) {
9268f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(CatchStmts),
9274dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        move(Finally));
9284dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
9294dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
930be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Rebuild an Objective-C exception declaration.
931be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
932be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new declaration.
933be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
934be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
935be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                    TypeSourceInfo *TInfo, QualType T) {
936c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildObjCExceptionDecl(TInfo, T,
937c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                            ExceptionDecl->getIdentifier(),
938be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                            ExceptionDecl->getLocation());
939be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
940c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
941be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Build a new Objective-C @catch statement.
942be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
943be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
944be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
945be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  OwningStmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
946be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          SourceLocation RParenLoc,
947be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          VarDecl *Var,
948be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          StmtArg Body) {
949be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
950be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          Sema::DeclPtrTy::make(Var),
951be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          move(Body));
952be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
953c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9544dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @finally statement.
9554dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
9564dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9574dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9584dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
9594dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                            StmtArg Body) {
9604dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return getSema().ActOnObjCAtFinallyStmt(AtLoc, move(Body));
9614dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
962c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9638fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @throw statement.
964d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  ///
965d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
966d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
967d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  OwningStmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
968d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor                                          ExprArg Operand) {
969d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    return getSema().BuildObjCAtThrowStmt(AtLoc, move(Operand));
970d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
971c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9728fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @synchronized statement.
9738fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  ///
9748fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
9758fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9768fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningStmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
9778fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 ExprArg Object,
9788fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 StmtArg Body) {
9798fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, move(Object),
9808fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 move(Body));
9818fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  }
982c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor
983c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// \brief Build a new Objective-C fast enumeration statement.
984c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  ///
985c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
986c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
987c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
988c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation LParenLoc,
989c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                StmtArg Element,
990c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                ExprArg Collection,
991c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation RParenLoc,
992c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                StmtArg Body) {
993c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
994c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                move(Element),
995c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                move(Collection),
996c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                RParenLoc,
997c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                move(Body));
998c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  }
999c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
100043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
100143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
100243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
100343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
10041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
1005a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
100843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
10091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
101043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
101143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
101243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
101343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
101443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
101543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
101643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
101743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
101843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
101943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
102043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
102243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
102343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
102643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
102743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
102843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
102943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
103043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
103143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
103243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
103343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1039f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1040f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              LookupResult &R,
1041f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              bool RequiresADL) {
1042f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1043f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
1044f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1045f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1046f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
1047f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
1048f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
1049f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
1050a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
1051a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
1052dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      ValueDecl *VD, SourceLocation Loc,
1053dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      TemplateArgumentListInfo *TemplateArgs) {
1054a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
1055a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
1056a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
1057dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
1058dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
1059c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1060dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return getSema().BuildDeclarationNameExpr(SS, Loc, VD);
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
10641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1072a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1074a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1075a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1076a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
1077a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
1078a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
1079a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                NestedNameSpecifier *Qualifier,
108026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceRange QualifierRange,
108126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  TypeSourceInfo *ScopeType,
108226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceLocation CCLoc,
1083fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                  SourceLocation TildeLoc,
1084a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
10851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
10936ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr));
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Build a new builtin offsetof expression.
10978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ///
10988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
10998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OwningExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
11018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       TypeSourceInfo *Type,
11028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       Action::OffsetOfComponent *Components,
11038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       unsigned NumComponents,
11048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       SourceLocation RParenLoc) {
11058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
11068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          NumComponents, RParenLoc);
11078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1108c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1113a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
11145ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
1116a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
11211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
11311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
11371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
11451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
11501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
11661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
116783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
116883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
116983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
1170f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                                     ValueDecl *Member,
11716bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                     NamedDecl *FoundDecl,
1172d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
11738a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
1174d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
1175d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
1176d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
11771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
117883a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor      Expr *BaseExpr = Base.takeAs<Expr>();
11796bb8017bb9e828d118e15e59d71c66bba323c364John McCall      if (getSema().PerformObjectMemberConversion(BaseExpr, Qualifier,
11806bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                                  FoundDecl, Member))
118183a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        return getSema().ExprError();
11828aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
11831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
118483a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        new (getSema().Context) MemberExpr(BaseExpr, isArrow,
1185d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
1186d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
1187d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
1188d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
11891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
119183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
119283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
119383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
119483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
119583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
1196aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
1197aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
11986bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // FIXME: this involves duplicating earlier analysis in a lot of
11996bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // cases; we should avoid this when possible.
1200c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    LookupResult R(getSema(), Member->getDeclName(), MemberLoc,
1201c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                   Sema::LookupMemberName);
12026bb8017bb9e828d118e15e59d71c66bba323c364John McCall    R.addDecl(FoundDecl);
1203c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1204c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
1205aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1206aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                              OpLoc, isArrow,
1207129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1208c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
12121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
1218c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc,
12196ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor                                LHS.takeAs<Expr>(), RHS.takeAs<Expr>());
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
12231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
12311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
12361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12399d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
12409d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
1243b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1244b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall                                         move(SubExpr));
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
12481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
125242f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
125542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
125642f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              move(Init));
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
12601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1267aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1268129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
1269aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
1270aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1271129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1272129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
12732d1c21414199a7452f122598189363a3922605b1Douglas Gregor                                              DeclarationName(&Accessor),
1274129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              AccessorLoc,
1275129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
12791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1284e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1285e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
1286e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    OwningExprResult Result
1287e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1288e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1289e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1290c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1291e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1292e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1293e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1294e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1295e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
12991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
13181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
13271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
13321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
13371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1343c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1344f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
13481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
13491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
13591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
13981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
14061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
14111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
14169d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
14239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
14241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
14289d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
14291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
14311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
14339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
14341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
14371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
14399d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
14401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
14421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
14471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
14579d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1462c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
1463c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1464c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1465c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
14749d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1479c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1480c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1481c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1482c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
14919d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1496c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1497c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1498c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1499c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
15089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1513c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
1514c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1515c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1516c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
15249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                TypeSourceInfo *TInfo,
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
152888650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
15309d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                               TInfo->getType().getAsOpaquePtr(),
1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
153288650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
15331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
154157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
154257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
154357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        TypeSourceInfo *Operand,
1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1545c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
154657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
155357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
155457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
155757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, move(Operand),
155857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
15591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
15601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
15641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1567828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1568828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1570828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1571828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1587c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1588036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1589036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1590036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
16011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
16021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
16031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
16111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
16161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
16591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
16631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1668865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1672f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1676f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1677f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
1678f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location,
1679f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1680f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1681f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location);
1682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1688f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1689f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1690f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1691d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1692f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
17004411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
17044411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
1705c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
17064411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
17074411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor      return getSema().ExprError();
1708c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
17094411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
17104411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           move_arg(ConvertedArgs));
1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1754865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
1755aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1758a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1759a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1760129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
1761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1762c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1763129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1765a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1766a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1768aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1769aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1770129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
1771129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            Name, MemberLoc, TemplateArgs);
1772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1774129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
17753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
17763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
17773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1778129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE,
1779aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1780129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1781129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1782129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1783129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1784c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1785129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1786129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
17873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
17883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
17893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1791aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1792aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1793c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1794c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
17953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
17961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
180281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                         TypeSourceInfo *EncodeTypeInfo,
1803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
180481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
1805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
180892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C class message.
180992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
181092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
181192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1812c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
181392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
181492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
181592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
181692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     ReceiverTypeInfo->getType(),
181792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     /*SuperLoc=*/SourceLocation(),
1818f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                     Sel, Method, LBracLoc, RBracLoc,
181992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     move(Args));
182092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
182192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
182292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C instance message.
182392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult RebuildObjCMessageExpr(ExprArg Receiver,
182492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
182592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1826c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
182792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
182892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
182992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    QualType ReceiverType = static_cast<Expr *>(Receiver.get())->getType();
183092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildInstanceMessage(move(Receiver),
183192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        ReceiverType,
183292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        /*SuperLoc=*/SourceLocation(),
1833f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                        Sel, Method, LBracLoc, RBracLoc,
183492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        move(Args));
183592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
183692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
1837f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C ivar reference expression.
1838f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1839f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1840f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1841f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult RebuildObjCIvarRefExpr(ExprArg BaseArg, ObjCIvarDecl *Ivar,
1842f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          SourceLocation IvarLoc,
1843f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          bool IsArrow, bool IsFreeIvar) {
1844f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    // FIXME: We lose track of the IsFreeIvar bit.
1845f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
1846f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1847f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
1848f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
1849f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1850f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IvarLoc,
1851f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         SS, DeclPtrTy());
1852f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1853f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1854c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1855f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1856f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1857c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1858c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1859f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              Base->getType(),
1860c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IvarLoc, IsArrow, SS,
1861f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1862c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1863f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1864f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1865e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor
1866e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// \brief Build a new Objective-C property reference expression.
1867e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  ///
1868e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1869e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1870c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  OwningExprResult RebuildObjCPropertyRefExpr(ExprArg BaseArg,
1871e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              ObjCPropertyDecl *Property,
1872e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              SourceLocation PropertyLoc) {
1873e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    CXXScopeSpec SS;
1874e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1875e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
1876e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                   Sema::LookupMemberName);
1877e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    bool IsArrow = false;
1878e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1879e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         /*FIME:*/PropertyLoc,
1880e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         SS, DeclPtrTy());
1881e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.isInvalid())
1882e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return getSema().ExprError();
1883c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1884e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.get())
1885e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return move(Result);
1886c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1887c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1888e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              Base->getType(),
1889c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/PropertyLoc, IsArrow,
1890c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              SS,
1891e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*FirstQualifierInScope=*/0,
1892c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1893e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*TemplateArgs=*/0);
1894e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  }
1895c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1896c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// \brief Build a new Objective-C implicit setter/getter reference
18979cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// expression.
18989cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  ///
18999cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1900c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// Subclasses may override this routine to provide different behavior.
19019cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  OwningExprResult RebuildObjCImplicitSetterGetterRefExpr(
19029cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Getter,
19039cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          QualType T,
19049cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Setter,
19059cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        SourceLocation NameLoc,
19069cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          ExprArg Base) {
19079cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // Since these expressions can only be value-dependent, we do not need to
19089cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // perform semantic analysis again.
19099cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return getSema().Owned(
19109cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
19119cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     Setter,
19129cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     NameLoc,
19139cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          Base.takeAs<Expr>()));
19149cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  }
19159cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor
1916f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C "isa" expression.
1917f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1918f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1919f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1920f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult RebuildObjCIsaExpr(ExprArg BaseArg, SourceLocation IsaLoc,
1921f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                      bool IsArrow) {
1922f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
1923f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1924f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
1925f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
1926f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1927f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IsaLoc,
1928f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         SS, DeclPtrTy());
1929f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1930f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1931c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1932f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1933f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1934c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1935c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1936f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              Base->getType(),
1937c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IsaLoc, IsArrow, SS,
1938f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1939c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1940f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1941f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1942c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
19511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
19561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
19591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
19610da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
19631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
19721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
19771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
19791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
198343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
198443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
198543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
198643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
198843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
198943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
19901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
199243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
199343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
199443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
19954bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
199843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
19994bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#define ABSTRACT(Stmt)
200043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
20014bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
200243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
200343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
200443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
200543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
20061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20075ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E));
200843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
20091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
20101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
201143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
201243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
20131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2015670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
2016454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
2018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
2019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
2021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
2022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
20234bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#define ABSTRACT(Stmt)
2024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
2025454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
20264bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
20271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
20281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2030657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
2031657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
2032657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
2033dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
2034dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
2035a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
2036c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
2037c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
20380979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
20390979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
20401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
204143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
2042dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
2043dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
20441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
2045c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
2046c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
2047dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
2048dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
2051c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
2052a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
2053c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
2054dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2056dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
2057dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
20581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
2059a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
2060a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
2061a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
2062dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2065a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
2066c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
2067c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
20681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2069dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
20701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
2071dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
20727c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
20737c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       NNS->getAsNamespace()));
20741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
2075dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2076dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
2077dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2079dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2080dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2082dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
2083dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
2084dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
2085dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
20861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2087dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
2088dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
2089fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2090124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
2091124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
2092d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
2093d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
20941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2095dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
2096dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2097dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
2098dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
21011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2102edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   T);
2103dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
2104dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
21051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2106dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
21071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
2108dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
2109dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
2110dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
21111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
211281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
2113dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 SourceLocation Loc,
2114dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 QualType ObjectType) {
211581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
211681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
211781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
211881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
211981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
212081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
212181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
212281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
212381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
21243e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
212581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
212681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
21271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
212881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
212981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
213081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
213181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
2132c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    QualType T = getDerived().TransformType(Name.getCXXNameType(),
2133124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
213481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
213581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
21361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
213781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
21381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
213981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
214081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
21411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
21421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
214381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
214481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
214581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
214681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
21471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
21483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
21493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
21507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  SourceLocation Loc = getDerived().getBaseLocation();
21517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor
2152d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
21531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2154d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
2155124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2156124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
2157d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
2158d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2160d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
21627c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2163d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
2164d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
21651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2166d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
2167d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
2168d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
2169d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
21701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2171d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
2172d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
2173d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
21741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2175f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
2176f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
2177d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2179d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
21801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2181d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
2182124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2183124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
21843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
2185d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2187d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2188dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
2189dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
2190d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2192ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
2193c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
2194ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
2195c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2196c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
2197ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
2198d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2200d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
22011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
22027c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2203d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
2204d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
22051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2206d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2207d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
2208d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
22091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2210d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
2211d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
22121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2213f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
2214f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
2215f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
2216d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
2217d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
2218d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
2219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
2220833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
2221833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
2223670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
2224670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
22259f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
2226833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2227833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
2229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
2230a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2231c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2232833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2233833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2234788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
2235788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
2236788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
2237c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
2239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
2243670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
2244833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
2245828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2246833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2248833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2249833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2250833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2251833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
2252833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
2253833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2254833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
2255833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
2256833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
2257833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
2258833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
2259833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
22601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2261670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
2262a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2263833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
2264a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2265833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2266833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
2267833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
2268833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2269833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2270833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2271670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2273670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
2274833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
2275972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
2276972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2277972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
2278788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
22797c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2280833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
2281833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2282828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
2283828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
2284828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
2285828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
2286828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
2287828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (E.isInvalid())
2288828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = NULL;
2289828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      else {
2290828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = E.takeAs<Expr>();
2291828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr->Retain();
2292828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      }
2293828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
2294828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2295828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2297670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2299788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
2300c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
2301788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
2302788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
2303788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
2304788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
2305c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2306788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
2307788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
2308788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
2309788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
2310788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
2311c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2312670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
2313670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
23141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
2315670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
23161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2317833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
2318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
2321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
2323833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2324833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *ETaken = E.takeAs<Expr>();
2325828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    ETaken->Retain();
2326833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2327833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2328670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2330670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2331670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2332670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
23331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2334670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2335670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
23361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2337833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2338833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2340828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2341828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2342828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2343828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2344833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2345833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2346828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2347670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2348670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
23491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2350670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2351828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2352833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2353670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2354670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2356670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2357833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2358670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2359670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2365c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntQualType TreeTransform<Derived>::TransformType(QualType T,
2366124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
23691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2372a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
23734802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2374c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2375124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
23761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
23791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2384124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2385124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
23881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
23901bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
23931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2394124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
23971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2398a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2403124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2404124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2409124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2410124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24149f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
24231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2426124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualifiedTypeLoc T,
2427124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2428a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2430124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2431124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
24401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Result = SemaRef.Context.getQualifiedType(Result, Quals);
2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.push<QualifiedTypeLoc>(Result);
2444a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2445a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // No location information to preserve.
2446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2459124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      BuiltinTypeLoc T,
2460124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2461ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2462ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
2463ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
2464ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2465ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
2466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2469a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2470124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      ComplexTypeLoc T,
2471124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
24751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2478c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                      PointerTypeLoc TL,
2479124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2480c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType PointeeType
2481c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
248292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType.isNull())
248392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return QualType();
248492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
248592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  QualType Result = TL.getType();
248692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType->isObjCInterfaceType()) {
248792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // A dependent pointer type 'T *' has is being transformed such
248892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // that an Objective-C class type is being replaced for 'T'. The
248992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // resulting pointer type is an ObjCObjectPointerType, not a
249092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // PointerType.
249192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    const ObjCInterfaceType *IFace = PointeeType->getAs<ObjCInterfaceType>();
249292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType,
249392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                              const_cast<ObjCProtocolDecl **>(
249492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                                           IFace->qual_begin()),
249592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                              IFace->getNumProtocols());
2496c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2497c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
2498c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    NewT.setStarLoc(TL.getSigilLoc());
249992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    NewT.setHasProtocolsAsWritten(false);
250092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    NewT.setLAngleLoc(SourceLocation());
250192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    NewT.setRAngleLoc(SourceLocation());
250292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    NewT.setHasBaseTypeAsWritten(true);
250392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Result;
250492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2505c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
250692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (getDerived().AlwaysRebuild() ||
250792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      PointeeType != TL.getPointeeLoc().getType()) {
250892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
250992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Result.isNull())
251092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return QualType();
251192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2512c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
251392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
251492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2515c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Result;
2516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
25181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
25191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2520a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2521124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  BlockPointerTypeLoc TL,
2522124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  QualType ObjectType) {
2523db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  QualType PointeeType
2524c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2525c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (PointeeType.isNull())
2526c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return QualType();
2527c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2528c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType Result = TL.getType();
2529c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (getDerived().AlwaysRebuild() ||
2530c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      PointeeType != TL.getPointeeLoc().getType()) {
2531c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildBlockPointerType(PointeeType,
2532db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor                                                  TL.getSigilLoc());
2533db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor    if (Result.isNull())
2534db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor      return QualType();
2535db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  }
2536db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor
253739968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
2538db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2539db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  return Result;
2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
254285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
254385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
254485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
254585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
254685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
254785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
254885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2549124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ReferenceTypeLoc TL,
2550124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
255185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
255285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
255385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
255485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
255585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
255685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
255785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
255885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
255985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
256085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
256185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
256285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
256385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
256485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
256585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
256685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
256785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
256885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
256985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
257085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
257185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
257285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
257385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
257485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
257585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
257685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
257785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
257885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2582124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 LValueReferenceTypeLoc TL,
2583124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2584124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2590124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 RValueReferenceTypeLoc TL,
2591124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2592124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
25961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2598124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   MemberPointerTypeLoc TL,
2599124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
261685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
261785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
26291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2631124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ConstantArrayTypeLoc TL,
2632124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
264485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
264585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2649c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
26531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2657a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2667124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              IncompleteArrayTypeLoc TL,
2668124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              QualType ObjectType) {
2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2670a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2674a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2675a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
267985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
268085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2684c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2691577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2693577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2696124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   VariableArrayTypeLoc TL,
2697124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2703670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2704670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2705670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2715a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
272185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2726c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
27311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2733577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2738124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                             DependentSizedArrayTypeLoc TL,
2739124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2742577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2743577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2745670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2746670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
27471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2751577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2762a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
276385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
27681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2777577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2780577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2782124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      DependentSizedExtVectorTypeLoc TL,
2783124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2788577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2789577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2791670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2792670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2793670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2794577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2795577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2796577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2798a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2800eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2801eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2802a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2803577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2804577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2805a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2807a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2808a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2810a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2811a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2812a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2814a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2815a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2817a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2818a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2819a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2820a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2821577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2824a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2825124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     VectorTypeLoc TL,
2826124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2828577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2829577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2830577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2833a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
283582287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
283682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson      T->isAltiVec(), T->isPixel());
2837a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2838a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2839a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2840c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2841a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2842a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2844a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2845577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2848a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2849124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        ExtVectorTypeLoc TL,
2850124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2851a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2852577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2853577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2856a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2857a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2858a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2860a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2861a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2862a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2863a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2864a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2865c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2866a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2867a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2869a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2870577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2871577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
287321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
287421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
287521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
287621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
287721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
287821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
287921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
288021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
288121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
288221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
288321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
288421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
288521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
288621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
288721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
288821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
288921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
289016573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                               OldParm->getStorageClassAsWritten(),
289121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
289221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
289321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
289421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
289521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
289621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
289721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<QualType> &PTypes,
289821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
29001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2902a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2903a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2904a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2905a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2906a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2907a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
290821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
290921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
291021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2911a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2913a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2914a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2915a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2916a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2917a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2918a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2919a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2920a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
292121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2922a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
29231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
292421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PTypes.push_back(NewType);
292521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PVars.push_back(NewParm);
2926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
29271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
292821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
292921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
293021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
293121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
293221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
293321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
293421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   FunctionProtoTypeLoc TL,
293521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   QualType ObjectType) {
2936895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // Transform the parameters. We do this first for the benefit of template
2937895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiations, so that the ParmVarDecls get/ placed into the template
2938895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiation scope before we transform the function type.
293921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
294021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
294121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
294221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return QualType();
2943c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2944895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  FunctionProtoType *T = TL.getTypePtr();
2945895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2946895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  if (ResultType.isNull())
2947895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor    return QualType();
2948c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2952a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2954a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2955a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2956a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2957a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getTypeQuals());
2958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2959a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2960a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
29611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2962a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2965a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2966a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2967a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2968a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2973a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2974124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 FunctionNoProtoTypeLoc TL,
2975124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 QualType ObjectType) {
2976a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2977a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2978a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2979a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2980a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2981a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2983a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2984a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2985a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2986a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2987a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2988a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2991577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2993ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2994ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2995124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 UnresolvedUsingTypeLoc TL,
2996124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2997ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
29987c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2999ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
3000ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
3001ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3002ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
3003ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
3004ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
3005ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
3006ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
3007ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
3008ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3009ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
3010ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
3011ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
3012ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
3013ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3014ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
3015ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
3016ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3018a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
3019124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypedefTypeLoc TL,
3020124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
3021a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
3022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
30237c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
30247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
3025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
3026577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3028a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
3031a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
3032a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3034a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3035a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3036a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
3037a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3040577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
3044124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypeOfExprTypeLoc TL,
3045124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3046670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
3047670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3049cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3052577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3055cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
3056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
3057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
30611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3062a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3063cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3064cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3065cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3066a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
3072124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     TypeOfTypeLoc TL,
3073124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3074cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3075cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3076cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
3077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3080cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3081cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3083a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
30851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3087cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3088cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3089cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3090cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
3091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
3097124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       DecltypeTypeLoc TL,
3098124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
3100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3101670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
3102670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
3105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
3111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
3112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
3116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
3118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
3125124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     RecordTypeLoc TL,
3126124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
3128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
31297c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
3131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
3132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
3137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
3138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
31411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
3143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
3150124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   EnumTypeLoc TL,
3151124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
3153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
31547c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31557c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
3156577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
3157577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
3162a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
3163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3167a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
3168a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31727da2431c23ef1ee8acb114e39692246e1801afc2John McCall
31737da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
3174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
3175124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                         ElaboratedTypeLoc TL,
3176124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedType *T = TL.getTypePtr();
3178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this should be a nested type.
31807da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
31817da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
31827da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Underlying != T->getUnderlyingType()) {
3187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
3188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3191a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3192a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3193a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
31967da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
31971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31983cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
31993cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
32003cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
32013cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         InjectedClassNameTypeLoc TL,
32023cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         QualType ObjectType) {
32033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
32043cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
32053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
32063cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
32073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
32083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
32093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
32103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
32113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
32121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
3215a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
3216124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                TemplateTypeParmTypeLoc TL,
3217124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                QualType ObjectType) {
3218a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
3219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
32211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
322249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
3223a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
3224124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         SubstTemplateTypeParmTypeLoc TL,
3225124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         QualType ObjectType) {
3226a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
322749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
322849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
322949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
3230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
3232833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3233833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
3234833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
3235a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
3237833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
3238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
3239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
3240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3241828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
3242828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
3243828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
3244828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
3245828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
3246833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
3248833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
3249833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
3250833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
3251833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3252833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3253833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
3254833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
3255dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
3256c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3257dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
3258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3259833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
3260833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
3261833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3262833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
3263833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
32641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
3265dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
3266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
3267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
32681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3269d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
3270d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3271d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3272d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
3273d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
3274d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
3275d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
3276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
3277d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
3278d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
32791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3280833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
3281833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3282833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
3283833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
3284833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
3285d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
32861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3287833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
3288833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
3289833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
3290833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
3291833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
3292833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
3293833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
3294833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
3295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
32961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
3298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
3303124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualifiedNameTypeLoc TL,
3304124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameType *T = TL.getTypePtr();
3306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
3307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3308124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                SourceRange(),
3309124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                ObjectType);
3310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
3311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
3314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
3315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3318a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3319a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
3320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Named != T->getNamedType()) {
3321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildQualifiedNameType(NNS, Named);
3322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
3327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33334714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
33344714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor                                                       DependentNameTypeLoc TL,
3335124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
33364714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T = TL.getTypePtr();
3337833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3338833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /* FIXME: preserve source information better than this */
3339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceRange SR(TL.getNameLoc());
3340833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
3342124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR,
3343edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                ObjectType);
3344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
3345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result;
3348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
33501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType NewTemplateId
3351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
3352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
3353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
33541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
3356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
3357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
3358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
33591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3360c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
33614a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                                   NewTemplateId);
3362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
3363c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
33644a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                                   T->getIdentifier(), SR);
3365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
3368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
33694714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
3370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3378124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ObjCInterfaceTypeLoc TL,
3379124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3380ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCInterfaceType is never dependent.
3381ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
3382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3387124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjCObjectPointerTypeLoc TL,
3388124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3389ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCObjectPointerType is never dependent.
3390ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
339124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
339224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
339443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
339543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
339643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
339743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
33981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
33991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
340043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
340143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
340243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
340343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
340443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
340543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
340643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
340743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
340843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
340943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
341143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
341243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
341343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
341443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
341743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
341843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
34191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
342243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
342443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
34261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
343143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3437264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  OwningExprResult LHS(SemaRef), RHS(SemaRef);
3438264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3439264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3440264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
34411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3442264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3443264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3444264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3445264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
34461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3447264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3448264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3449264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3450264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3451264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
34521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
345543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
345843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
346143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
346543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
346643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
346743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
347043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
347143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
347243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
347343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
347443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
347643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
347743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
347843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
347943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
348143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
348243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
348343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
348443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
348643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
348743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
348943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
349043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
349143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
349443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
349543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
349643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
349743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
35001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
35011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
350243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
35038cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  OwningExprResult Cond(SemaRef);
35048cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
35058cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
3506c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
35078cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
3508aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3509aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3510aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
35118cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
35128cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
351399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
35148cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3515c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
351699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
351799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
351899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
3519c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
352043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
352143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
352243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
352343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
352643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
352743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
352843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
353043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3531586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      Cond.get() == S->getCond() &&
353299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
353343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
353443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
35351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3537586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), move(Cond), ConditionVar,
353899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Then),
35391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
354043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
354143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
354243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
354343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
354543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
3546d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  OwningExprResult Cond(SemaRef);
3547d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3548d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3549c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
3550d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3551aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3552aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3553aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
3554d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3555d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
355699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3557d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3558c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
355999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
356099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
356199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
35621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
356343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
3564586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult Switch
3565586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), move(Cond),
3566586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          ConditionVar);
356743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
356843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
357143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
357243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
357343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
357643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
357743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
357843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
358043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
358143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
358343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
35845656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  OwningExprResult Cond(SemaRef);
35855656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
35865656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
3587c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
35885656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
3589aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3590aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3591aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
35925656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
35935656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
359499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
35955656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3596c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
359799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
359899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
359999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
360143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
360243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
360343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
360443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
360643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3607586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor      Cond.get() == S->getCond() &&
360899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
360943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3612586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), move(Cond),
3613586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                       ConditionVar, move(Body));
361443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
361743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
361843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
361943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
362043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
362143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
362243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
362543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
362643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
362743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
363043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
363143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
363443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
363543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
363643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
363743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
363943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
364043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
36411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
364243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
364343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
364443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
364543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
364743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
364899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningExprResult Cond(SemaRef);
364999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
365099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
3651c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
365299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
3653aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3654aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3655aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
365699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
365799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
365899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
365999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3660c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
366199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
366299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
366399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
366543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
366643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
366743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
366843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
367043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
367143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
367243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
367343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
367543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
367643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
367743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
367843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
367943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
368243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
3683586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                     move(Init), move(Cond), ConditionVar,
36845ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson                                     getSema().MakeFullExpr(Inc),
368543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
368643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
368743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
368843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
36891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
36901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
369143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
36921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
369343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
369443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
369543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
369643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
369743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
36981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
369943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
370043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
370143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
370443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
37051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
370643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
370743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
370843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
370943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
371043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
371143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
371243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
37141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
371543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
371743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
371843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
37201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
372143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
372343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
372443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
372643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
372743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
372843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
372943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
37301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
373143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
373243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
373343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
373543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
373643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
373843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
373943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
374043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
374143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
3742aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
3743aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                         *D);
374443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
374543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
37461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
374743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
374843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
37491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
375043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
375143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
375343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
37541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
37551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
375743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
375843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
376043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
376143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
376343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
37641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
376543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
376643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
376743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
376843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
376943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3770c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3771703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema());
3772703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema());
3773ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 4> Names;
3774a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
3775703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningExprResult AsmString(SemaRef);
3776703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema());
3777703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3778703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  bool ExprsChanged = false;
3779c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3780703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the outputs.
3781703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
3782ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getOutputIdentifier(I));
3783c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3784703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3785703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain());
3786c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3787703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the output expr.
3788703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *OutputExpr = S->getOutputExpr(I);
3789703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(OutputExpr);
3790703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3791703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3792c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3793703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != OutputExpr;
3794c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3795703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Exprs.push_back(Result.takeAs<Expr>());
3796703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3797c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3798703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the inputs.
3799703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
3800ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getInputIdentifier(I));
3801c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3802703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3803703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain());
3804c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3805703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the input expr.
3806703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *InputExpr = S->getInputExpr(I);
3807703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(InputExpr);
3808703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3809703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3810c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3811703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != InputExpr;
3812c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3813703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Exprs.push_back(Result.takeAs<Expr>());
3814703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3815c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3816703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
3817703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    return SemaRef.Owned(S->Retain());
3818703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3819703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the clobbers.
3820703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
3821703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Clobbers.push_back(S->getClobber(I)->Retain());
3822703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3823703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // No need to transform the asm string literal.
3824703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  AsmString = SemaRef.Owned(S->getAsmString());
3825703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3826703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
3827703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isSimple(),
3828703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isVolatile(),
3829703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumOutputs(),
3830703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumInputs(),
3831a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson                                     Names.data(),
3832703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Constraints),
3833703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Exprs),
3834703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move(AsmString),
3835703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Clobbers),
3836703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getRParenLoc(),
3837703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isMSAsm());
383843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
383943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
384043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
384143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
384243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
38444dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body of the @try.
38454dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
38464dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (TryBody.isInvalid())
38474dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
3848c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
38498f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  // Transform the @catch statements (if present).
38508f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool AnyCatchChanged = false;
38518f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> CatchStmts(SemaRef);
38528f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
38538f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
38544dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Catch.isInvalid())
38554dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
38568f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    if (Catch.get() != S->getCatchStmt(I))
38578f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      AnyCatchChanged = true;
38588f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    CatchStmts.push_back(Catch.release());
38594dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
3860c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
38614dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the @finally statement (if present).
38624dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult Finally(SemaRef);
38634dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (S->getFinallyStmt()) {
38644dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    Finally = getDerived().TransformStmt(S->getFinallyStmt());
38654dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Finally.isInvalid())
38664dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
38674dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
38684dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
38694dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
38704dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
38714dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      TryBody.get() == S->getTryBody() &&
38728f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      !AnyCatchChanged &&
38734dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Finally.get() == S->getFinallyStmt())
38744dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
3875c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
38764dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
38774dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), move(TryBody),
38788f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                           move_arg(CatchStmts), move(Finally));
387943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
388143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
388243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
3884be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  // Transform the @catch parameter, if there is one.
3885be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *Var = 0;
3886be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (VarDecl *FromVar = S->getCatchParamDecl()) {
3887be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    TypeSourceInfo *TSInfo = 0;
3888be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (FromVar->getTypeSourceInfo()) {
3889be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
3890be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (!TSInfo)
3891be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor        return SemaRef.StmtError();
3892be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3893c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3894be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    QualType T;
3895be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (TSInfo)
3896be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = TSInfo->getType();
3897be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    else {
3898be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = getDerived().TransformType(FromVar->getType());
3899be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (T.isNull())
3900c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt        return SemaRef.StmtError();
3901be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3902c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3903be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
3904be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (!Var)
3905be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      return SemaRef.StmtError();
3906be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
3907c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3908be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getCatchBody());
3909be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (Body.isInvalid())
3910be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return SemaRef.StmtError();
3911c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3912c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
3913be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             S->getRParenLoc(),
3914be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             Var, move(Body));
391543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
391743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
391843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
39204dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body.
39214dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
39224dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (Body.isInvalid())
39234dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
3924c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
39264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
39274dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Body.get() == S->getFinallyBody())
39284dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
39294dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
39304dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
39314dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
39324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                               move(Body));
393343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
393543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
393643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
3938d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  OwningExprResult Operand(SemaRef);
3939d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (S->getThrowExpr()) {
3940d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    Operand = getDerived().TransformExpr(S->getThrowExpr());
3941d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    if (Operand.isInvalid())
3942d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      return getSema().StmtError();
3943d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
3944c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3945d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3946d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      Operand.get() == S->getThrowExpr())
3947d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    return getSema().Owned(S->Retain());
3948c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3949d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), move(Operand));
395043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
395243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
395343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
395443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
39551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
39568fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the object we are locking.
39578fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
39588fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Object.isInvalid())
39598fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
3960c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39618fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the body.
39628fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getSynchBody());
39638fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Body.isInvalid())
39648fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
3965c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39668fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // If nothing change, just retain the current statement.
39678fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
39688fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Object.get() == S->getSynchExpr() &&
39698fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Body.get() == S->getSynchBody())
39708fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.Owned(S->Retain());
39718fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor
39728fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Build a new statement.
39738fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
39748fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                    move(Object), move(Body));
397543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
397643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
397743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
397843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
397943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
3981c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the element statement.
3982c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult Element = getDerived().TransformStmt(S->getElement());
3983c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Element.isInvalid())
3984c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
3985c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3986c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the collection expression.
3987c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningExprResult Collection = getDerived().TransformExpr(S->getCollection());
3988c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Collection.isInvalid())
3989c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
3990c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3991c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the body.
3992c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3993c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Body.isInvalid())
3994c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
3995c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3996c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // If nothing changed, just retain this statement.
3997c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3998c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Element.get() == S->getElement() &&
3999c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Collection.get() == S->getCollection() &&
4000c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Body.get() == S->getBody())
4001c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.Owned(S->Retain());
4002c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4003c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Build a new statement.
4004c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
4005c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   /*FIXME:*/S->getForLoc(),
4006c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Element),
4007c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Collection),
4008c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   S->getRParenLoc(),
4009c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Body));
401043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
401143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
401243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
401343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
401443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
401543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
401643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
401743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
401843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
401943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
402043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
402143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
402243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
402343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
402443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
402543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
40261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
402743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
402843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
4029a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                            ExceptionDecl->getTypeSourceInfo(),
403043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
403143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
403243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
403343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
403443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
403543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
403643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
403743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
403843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
403943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
40401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
404143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
404243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
404343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
404443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
404543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
404643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
404743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
40481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
404943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
405043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
405143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
40521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
405343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
405443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
405543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
405643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
405743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
405943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
406043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
406143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
406243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
40631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
406443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
406543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
406643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
40671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
406843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
406943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
407043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
407143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
40721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
407343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
407443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
407543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
40761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
407743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
407843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
407943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
408143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
408243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
408343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
40841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
408543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
408643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
40871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
408843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
409043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
4092577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
40931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
40941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4095454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
40961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
40971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
40981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4101454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
4102a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
4103a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
4104a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4105edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                       E->getQualifierRange());
4106a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
4107a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
4108a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4109dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4110dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
41117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
41127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getDecl()));
4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4116c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (!getDerived().AlwaysRebuild() &&
4117a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
4118a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
4119dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      !E->hasExplicitTemplateArgumentList()) {
41201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4121dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
4122dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
4123dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
4124a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
4125dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return SemaRef.Owned(E->Retain());
4126a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4127dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4128dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
4129dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  if (E->hasExplicitTemplateArgumentList()) {
4130dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
4131dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4132dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
4133dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4134dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TemplateArgumentLoc Loc;
4135dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4136dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall        return SemaRef.ExprError();
4137dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TransArgs.addArgument(Loc);
4138dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    }
4139dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
4140dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4141a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
4142dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                         ND, E->getLocation(), TemplateArgs);
4143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
41441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4147454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
41481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
41501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4153454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4159454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4165454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
41661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4171454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
41721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
41761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4177454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
41831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
41891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4191454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
4192454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
41971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
42068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
42078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform the type.
42088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
42098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!Type)
42108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().ExprError();
4211c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform all of the components into components similar to what the
42138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // parser uses.
4214c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // FIXME: It would be slightly more efficient in the non-dependent case to
4215c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // just map FieldDecls, rather than requiring the rebuilder to look for
4216c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // the fields again. However, __builtin_offsetof is rare enough in
42178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // template code that we don't care.
42188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool ExprChanged = false;
42198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef Action::OffsetOfComponent Component;
42208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
42218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  llvm::SmallVector<Component, 4> Components;
42228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
42238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    const Node &ON = E->getComponent(I);
42248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Component Comp;
422572be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor    Comp.isBrackets = true;
42268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocStart = ON.getRange().getBegin();
42278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocEnd = ON.getRange().getEnd();
42288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
42298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array: {
42308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
42318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(FromIndex);
42328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (Index.isInvalid())
42338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return getSema().ExprError();
4234c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      ExprChanged = ExprChanged || Index.get() != FromIndex;
42368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = true;
42378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.E = Index.takeAs<Expr>(); // FIXME: leaked
42388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
42398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4240c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
42428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
42438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = false;
42448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.IdentInfo = ON.getFieldName();
424529d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor      if (!Comp.U.IdentInfo)
424629d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor        continue;
4247c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4249c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4250cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case Node::Base:
4251cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Will be recomputed during the rebuild.
4252cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
42538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4254c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Components.push_back(Comp);
42568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
4257c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // If nothing changed, retain the existing expression.
42598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
42608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Type == E->getTypeSourceInfo() &&
42618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      !ExprChanged)
42628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return SemaRef.Owned(E->Retain());
4263c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Build a new offsetof expression.
42658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
42668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          Components.data(), Components.size(),
42678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          E->getRParenLoc());
42688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
42698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
42708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived>
42718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorSema::OwningExprResult
4272454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
4274a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
42755557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
4276a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
42775ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42805ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
42821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42835ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
42841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
42871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
42891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
42941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
4296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
42981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
4300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
43091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4310454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
4311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
43241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4333454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
4341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
43511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
4353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
43601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
43621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4372454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
437783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
437883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
43791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
438083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4381edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  E->getQualifierRange());
4382c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
438383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
438483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
43851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4386f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
43877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
43887c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getMemberDecl()));
4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43926bb8017bb9e828d118e15e59d71c66bba323c364John McCall  NamedDecl *FoundDecl = E->getFoundDecl();
43936bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (FoundDecl == E->getMemberDecl()) {
43946bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = Member;
43956bb8017bb9e828d118e15e59d71c66bba323c364John McCall  } else {
43966bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = cast_or_null<NamedDecl>(
43976bb8017bb9e828d118e15e59d71c66bba323c364John McCall                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
43986bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!FoundDecl)
43996bb8017bb9e828d118e15e59d71c66bba323c364John McCall      return SemaRef.ExprError();
44006bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
44016bb8017bb9e828d118e15e59d71c66bba323c364John McCall
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
440483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
44058a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
44066bb8017bb9e828d118e15e59d71c66bba323c364John McCall      FoundDecl == E->getFoundDecl() &&
44071f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson      !E->hasExplicitTemplateArgumentList()) {
4408c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
44091f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
44101f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
44111f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44131f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4415d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
44168a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  if (E->hasExplicitTemplateArgumentList()) {
4417d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4418d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
44198a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4420d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
4421d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
44228a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
4423d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
44248a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
44258a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
4426c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4431c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
4432c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
4433c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
4434c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
4435c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
4436c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
443983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
444083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
44428a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
44436bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                        FoundDecl,
4444d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                        (E->hasExplicitTemplateArgumentList()
4445d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
4446c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
44501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4451454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
44631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
44691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
4472454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
4473454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
44771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4478454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
449847e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
44991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
450047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
4502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
45051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4506454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
4507a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
4508a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
45096eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4514454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
45159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
45169d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
45191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
4521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
45221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
45249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
45259d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
45281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4529a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
45306eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
45359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
45371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45399d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
45409d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            NewT,
4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4547454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
454842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
454942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
455042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
455142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return SemaRef.ExprError();
45521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
455842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      OldT == NewT &&
4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
45601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
45621d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // Note: the expression type doesn't necessarily match the
45631d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // type-as-written, but that's okay, because it should always be
45641d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // derivable from the initializer.
45651d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
456642f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
4567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4573454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
4574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
45801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
45831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
4584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
4585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
4586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
4587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
4588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4592454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
4593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
45941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
4597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
4598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
4602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
46061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
4609e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
4610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4614454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
46161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
461743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
4618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
4619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
462243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
4623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
4624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
4627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
4628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
4629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
4630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
4631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
4632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
46341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
46391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
46421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
4645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
46471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
4656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
46621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
46651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
4668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
46741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
4683454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
46845557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4685c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
46865557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
46875557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
46941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
47001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4701454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
47041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
4724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
47271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4728454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4752454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4758c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntSema::OwningExprResult
4759454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
47601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4776454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
47811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
47941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
47951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4802454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
48191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
48271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4828454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
48291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4834454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4835668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
4836668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
4837668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
4838668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
4839668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
4840668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4841668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4842c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4843668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
4844668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
4845668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4846668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4847668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
4848668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4849668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4850668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      return SemaRef.ExprError();
4851668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4852668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
4853668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
4854668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
4855668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
4856668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4857668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
4858668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4859668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4860668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
48616eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      if (getDerived().DropCallArgument(E->getArg(I)))
48626eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor        break;
4863c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4864668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4865668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4866668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        return SemaRef.ExprError();
4867668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4868668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      // FIXME: Poor source location information.
4869668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      SourceLocation FakeCommaLoc
4870668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        = SemaRef.PP.getLocForEndOfToken(
4871668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4872668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      FakeCommaLocs.push_back(FakeCommaLoc);
4873668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      Args.push_back(Arg.release());
4874668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    }
4875668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4876668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc,
4877668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
4878668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        FakeCommaLocs.data(),
4879668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
4880668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4881668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4882668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4883668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
4884668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4885668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
4886668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
4887668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
4888668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
4889668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4890668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
4891668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
4892668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4893668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4894668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4895668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4896668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4897668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4898668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4899668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4904454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
4909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
49141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
49181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
49191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
49201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
49231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
4924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
4925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
4926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4930454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
4931454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
4932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
49351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4936454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
49379d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
49389d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
49411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
49441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
49469d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
49479d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
49501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4951a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
49526eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
49579d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
49591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
49601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
49621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
4963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
4966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
4967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
4968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
49691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
4970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
49719d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                              NewT,
4972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
4975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
4976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
49791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4980454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
4981454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4986454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
4987454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
4993454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
4994454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4999454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
5000454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
5006454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
50079d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
50089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
50111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50129d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
50139d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
50149d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5018a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
50196eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
50249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
50261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
5029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
5030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
50319d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                   NewT,
5032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
5033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
5034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5039454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
5040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
504157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    TypeSourceInfo *TInfo
504257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor      = getDerived().TransformType(E->getTypeOperandSourceInfo());
504357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    if (!TInfo)
5044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
50451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
504757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor        TInfo == E->getTypeOperandSourceInfo())
5048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
50491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
505057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getType(),
505157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             E->getLocStart(),
505257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             TInfo,
5053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
5054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
5057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
5058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
50591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
5060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
50611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
50681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
507057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getType(),
507157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                           E->getLocStart(),
5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
5073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
50771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5078454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
50791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
5085454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
50861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5091454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
50931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
51011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5102828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
5103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5107454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
5108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
51141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5121454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
51221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
51237c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
51247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
512853cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
5130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
51311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5132036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
5133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5137454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
5138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
51461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
5149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
5150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
5151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
5152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5156454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
5158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
5160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
5161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
5165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
5166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
5169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
5171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
5177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
5178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
518043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
5183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
5188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
5189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51911af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
51921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
51931af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
51941af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
51957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
51967c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
51971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
51981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
51991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
52021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
52031af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
52047c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
52057c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
52061af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
52071af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52081af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52091af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52101af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
52111af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
52121af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
52137c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52147c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
52151af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
52161af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52171af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5218c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
5221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
52221af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
52231af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
52241af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
52251af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
52261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
52271af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
52281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
52291af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
52301af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
52311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
52321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
52331af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
52341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
52351af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52375b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
52385b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
52395b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
52405b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
52415b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
52425b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
52435b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
52445b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
52455b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
52465b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
52475b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
5248c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      ArraySize
52495b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
5250c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                  ConsArrayT->getSize(),
52515b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  SemaRef.Context.getSizeType(),
52525b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  /*FIXME:*/E->getLocStart()));
52535b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
52545b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
52555b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
52565b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
52575b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
52585b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
52595b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
52605b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
52615b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
5262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
5263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
5264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
5266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
5268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
5269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
5271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
5272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
52741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
5275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5279454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
5280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
5281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
5282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52841af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
52851af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
52861af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
52871af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
52887c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52897c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
52901af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
52911af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5293c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
52951af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
52961af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
52971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
52981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
52991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
5305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
5306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
5307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
5308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5312a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
5313454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
5314a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
5315a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
5316a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
53171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5318a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  Sema::TypeTy *ObjectTypePtr = 0;
5319a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
5320c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5321a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
5322a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
5323a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
5324a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
5325a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
5326a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    return SemaRef.ExprError();
5327c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5328a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr);
5329a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
5330a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5331b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor                                                E->getQualifierRange(),
5332a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                ObjectType);
5333a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
5334a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
53351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5336a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
5337a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
5338a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
5339a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
5340a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
5341a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5342a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
5343a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
5344a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
5345a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
5346a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
5347a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
5348a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
5349a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
5350a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    CXXScopeSpec SS;
5351a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (Qualifier) {
5352a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setScopeRep(Qualifier);
5353a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setRange(E->getQualifierRange());
5354a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    }
5355c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5356a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(),
5357a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
5358a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
5359a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
5360a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
5361a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
5362a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
5363a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5364c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5365a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
5366a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
5367a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
5368a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
536926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
537026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
537126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
5372c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
5373a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                               ObjectType);
537426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
5375a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
5376a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
5377c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5378a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
5379a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
5380a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
5381a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
538226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getQualifierRange(),
538326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
538426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
5385fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
5386a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
5387a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
53881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5389a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
5390a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
5391ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
5392454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
5393f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
5394f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5395f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
5396f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
5397f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5398f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
5399f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
5400f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
54017c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
54027c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
54037c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
54049f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
54059f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
54069f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
54079f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
54089f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
54099f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
54109f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
54119f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5412f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5413f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
5414f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
5415f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5416f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5417f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
5418f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
5419f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
5420f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
5421f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5422f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
5423f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5424f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5425f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
5426f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
5427f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
5428f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5429f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
5430f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
5431f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
5432f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
5433f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5434edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                    Old->getQualifierRange());
5435f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
5436f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5437c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5438f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
5439f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
5440c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  }
5441c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5442c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (Old->getNamingClass()) {
544366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    CXXRecordDecl *NamingClass
544466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
544566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                            Old->getNameLoc(),
544666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
544766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
544866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5449c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
545066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5451f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5452f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5453f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
5454f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
5455f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
5456f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5457f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
5458f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
5459f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
5460f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5461f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
5462f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
5463f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5464f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
5465f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5466f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5467f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
5468f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
5469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5473454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
5474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
54751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
5477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
54791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
5482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
54831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
5485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
5486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
54871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
5489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
5490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
5491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
5492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
5493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5497865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
5498454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  DependentScopeDeclRefExpr *E) {
5499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
5500f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5501edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                E->getQualifierRange());
5502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
5503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
550681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
550781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
550881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
55091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5510f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
5511f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
5512f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
5513f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        Name == E->getDeclName())
5514f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
55151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5516f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5517f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
5518f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         Name, E->getLocation(),
5519f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
5520f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
5521d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
5522d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5524d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5525d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5527d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
5528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5530f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5531f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
5532f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       Name, E->getLocation(),
5533f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
5534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5538454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
5539321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
5540321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
5541321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
5542321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5543321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
5544321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
5545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
55537c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
55547c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
55601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
55636eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
55646eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
55656eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
55666eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
55676eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
55711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
5574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
5579c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
55801af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
55811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
5582c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
5584c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
55851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55864411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
55874411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
5588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
5589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
5592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
55935132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
55945132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
5595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5597454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
55985132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5601eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// \brief Transform a C++ reference-binding expression.
5602eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson///
5603eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// Since CXXBindReferenceExpr nodes are implicitly generated, we just
5604eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// transform the subexpression and return that.
5605eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssontemplate<typename Derived>
5606eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonSema::OwningExprResult
5607eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonTreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
5608eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  return getDerived().TransformExpr(E->getSubExpr());
5609eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
5610eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
56111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
5612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56145132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
56155132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
5616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
56195132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
56205132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5626454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXTemporaryObjectExpr *E) {
5627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
5634c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                  getDerived().TransformDecl(E->getLocStart(),
56357c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
56421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
5644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
564591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
564691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      ArgumentChanged = true;
564791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      break;
564891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    }
564991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor
5650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
56531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
5656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
56571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
566191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
566291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
566391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
5664a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth    return SemaRef.MaybeBindToTemporary(E->Retain());
566591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
56661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
5668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
5669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
5670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
56711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
5672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
5673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
5675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
5676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
5677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
5678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
5679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
5680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5685454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
5686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
5688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
5694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
5696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
5697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
57001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
5703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
5704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
5705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
5709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
57101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
57111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
5713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
5714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
5715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
5716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
5717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
5718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
5719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5723865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
5724454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXDependentScopeMemberExpr *E) {
5725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
5726aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
5727aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
5728aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5729aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
5730aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
5731aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
5732aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
5733aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5734aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
57351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5736aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
5737aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Sema::TypeTy *ObjectTy = 0;
5738d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
5739aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5740aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
5741a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
5742d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
5743d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
5744aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5745aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5746aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
5747aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
5748aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5749aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5750aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
5751aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
5752aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5753aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
57541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
57566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
5757c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
57586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
57596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
57606cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
57611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5762a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
5763a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
5764a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5765a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
5766aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
5767aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
5768a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
5769a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
5770a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
57711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
5773dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
5774aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            ObjectType);
577581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
577681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
57771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5778aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
57793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
57803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
57813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
5782aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
5783aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
57843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
57853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
57863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
57871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
57881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5789865d447ac6a4721ab58e898d014a21f2eff74b06John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5790aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
57913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
57923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
57933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
57943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
5795129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
57963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
57973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
5798129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
57993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
5801d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
58023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5803d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5804d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
58053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
5806d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
58073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5809865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5810aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
5811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
5812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
5813a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
5814a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
58153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
5816129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     Name,
5817129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     E->getMemberLoc(),
5818129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
5819129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
5820129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5821129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
5822129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult
5823454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5824129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
5825aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
5826aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5827aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
5828aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
5829aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5830aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5831aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5832aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5833aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5834aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5835129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5836129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5837129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5838129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5839129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5840edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  Old->getQualifierRange());
5841129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5842129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      return SemaRef.ExprError();
5843129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5844129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5845129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(),
5846129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5847129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5848129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5849129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5850129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
58517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
58527c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
58537c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
58549f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
58559f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
58569f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
58579f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
58589f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
58599f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
58609f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
58619f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5862129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5863129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5864129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5865129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5866129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5867129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5868129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5869129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5870129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5871129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5872129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5873129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5874129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5875129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5876129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5877c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  // Determine the naming class.
5878c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (!Old->getNamingClass()) {
5879c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    CXXRecordDecl *NamingClass
5880c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
588166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                          Old->getMemberLoc(),
588266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
588366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
588466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5885c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
588666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5887c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
5888c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5889129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5890129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5891129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5892129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5893129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5894129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5895129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5896129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5897129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        return SemaRef.ExprError();
5898129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5899129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5900129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5901c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
5902c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5903c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5904c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5905c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5906c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5907c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5908129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  return getDerived().RebuildUnresolvedMemberExpr(move(Base),
5909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
5910129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
5911129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
5912129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
5913129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
5914c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
5915129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
5916129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
5917129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
5918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5922454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
59231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
59261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
59271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5928454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
592981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *EncodedTypeInfo
593081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
593181d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!EncodedTypeInfo)
5932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
59331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
593581d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
59361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
593981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                            EncodedTypeInfo,
5940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
5941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5945454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
594692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Transform arguments.
594792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  bool ArgChanged = false;
594892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
594992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
595092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
595192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Arg.isInvalid())
595292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
5953c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
595492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
595592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Args.push_back(Arg.takeAs<Expr>());
595692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
595792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
595892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
595992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Class message: transform the receiver type.
596092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    TypeSourceInfo *ReceiverTypeInfo
596192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      = getDerived().TransformType(E->getClassReceiverTypeInfo());
596292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!ReceiverTypeInfo)
596392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
5964c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
596592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If nothing changed, just retain the existing message send.
596692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
596792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
596892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.Owned(E->Retain());
596992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
597092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Build a new class message send.
597192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
597292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getSelector(),
597392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getMethodDecl(),
597492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getLeftLoc(),
597592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               move_arg(Args),
597692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getRightLoc());
597792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
597892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
597992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Instance message: transform the receiver
598092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
598192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor         "Only class and instance messages may be instantiated");
598292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult Receiver
598392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    = getDerived().TransformExpr(E->getInstanceReceiver());
598492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (Receiver.isInvalid())
598592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.ExprError();
598692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
598792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // If nothing changed, just retain the existing message send.
598892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
598992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
599092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.Owned(E->Retain());
5991c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
599292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Build a new instance message send.
599392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  return getDerived().RebuildObjCMessageExpr(move(Receiver),
599492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getSelector(),
599592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getMethodDecl(),
599692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getLeftLoc(),
599792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             move_arg(Args),
599892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getRightLoc());
5999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6003454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
60041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6009454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
6010ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return SemaRef.Owned(E->Retain());
6011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6015454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
6016f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
6017f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6018f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6019f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6020f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor
6021f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // We don't need to transform the ivar; it will never change.
6022c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6023f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6024f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6025f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6026f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6027c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6028f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  return getDerived().RebuildObjCIvarRefExpr(move(Base), E->getDecl(),
6029f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->getLocation(),
6030f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->isArrow(), E->isFreeIvar());
6031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6035454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
6036e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // Transform the base expression.
6037e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6038e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (Base.isInvalid())
6039e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.ExprError();
6040c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6041e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // We don't need to transform the property; it will never change.
6042c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6043e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // If nothing changed, just retain the existing expression.
6044e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6045e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      Base.get() == E->getBase())
6046e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.Owned(E->Retain());
6047c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6048e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  return getDerived().RebuildObjCPropertyRefExpr(move(Base), E->getProperty(),
6049e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                 E->getLocation());
6050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
605409105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
6055454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
60569cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If this implicit setter/getter refers to class methods, it cannot have any
60579cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // dependent parts. Just retain the existing declaration.
60589cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (E->getInterfaceDecl())
60599cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6060c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
60619cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // Transform the base expression.
60629cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
60639cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (Base.isInvalid())
60649cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.ExprError();
6065c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
60669cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // We don't need to transform the getters/setters; they will never change.
6067c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
60689cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If nothing changed, just retain the existing expression.
60699cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
60709cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor      Base.get() == E->getBase())
60719cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6072c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
60739cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
60749cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getGetterMethod(),
60759cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getType(),
60769cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getSetterMethod(),
60779cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getLocation(),
60789cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             move(Base));
6079c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6084454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
6085ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // Can never occur in a dependent context.
60861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6091454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
6092f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
6093f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6094f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6095f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6096c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6097f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6098f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6099f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6100f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6101c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6102f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  return getDerived().RebuildObjCIsaExpr(move(Base), E->getIsaMemberLoc(),
6103f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                         E->isArrow());
6104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6108454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
6109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
6111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
6112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
6113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
6114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
61151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
6117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
6118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
61191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
61221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
61231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
6125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
6126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
6127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6131454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
6132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
6133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
61341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6139454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
6140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
6141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
61421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
61441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
6147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
615085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
615185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
615285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
6153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
6154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
615785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
615885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
615985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
6160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
6161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
616585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
616685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
616785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
616885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
616985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
6170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
617485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
617585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
617685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
61770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
617885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
6179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
61821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
6183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
6184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
6185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
6186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
6187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
6188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
6189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
6190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
6191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
6192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
61931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
61951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
61961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
61971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
6198577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
6199577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
6200577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
6201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
6202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
6203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
6204577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
6205577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
62061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6207577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
62081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
6209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
62101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
6211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
62121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
62141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
62151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
6216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
6217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
621885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
621985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
62201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
622185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
6222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6223577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
62251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
62261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
6227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
622885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
622985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
62301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
623185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
6232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
62331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
62351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
62361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
6237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
6238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
6239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
6240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
62411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
6243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
62471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
62481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
6249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
6250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
6251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
6252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
62531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
6255577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
626082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       unsigned NumElements,
626182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       bool IsAltiVec, bool IsPixel) {
6262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
626382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  return SemaRef.Context.getVectorType(ElementType, NumElements,
626482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       IsAltiVec, IsPixel);
6265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
62661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
6269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
6270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
6271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
6272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
6273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
62741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
6275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
6276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
6277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
6278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
62791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
62811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
62821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
6283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
6284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
6285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
6286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
62871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
62901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
6291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
62921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
6293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
62941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
6295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
6296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
6297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
6298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
62991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
6302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
6303a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
6304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
6305a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
6306ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
6307ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
6308ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
6309ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
631092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // FIXME: Doesn't account for ObjCInterfaceDecl!
6311ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
6312ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
6313ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
6314ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
6315ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
6316ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6317ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
6318ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
6319ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
6320c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6321ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
6322ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
6323ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
6324ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
6325ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
6326ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6327ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
6328ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
6329ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6330ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
6331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
6332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
6333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
6337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
6338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
6342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
6343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
6347833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
6348833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
6349d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
6350d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
6351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6353dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6354dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6355dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6356dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6357a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
6358c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
6359d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
6360dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
6361dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
6362dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
6363dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
6364dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
63651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
6366495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
6367c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
6368c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
636946646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
6370dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6371dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6372dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6373dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6374dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6375dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6376dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
6377dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
6378dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6379dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6380dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6381dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6382dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6383dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6384dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
6385edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   QualType T) {
6386edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor  if (T->isDependentType() || T->isRecordType() ||
6387dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
6388a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6389dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
6390dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
6391dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
63921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6393dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
6394dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
6395dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
63961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6397d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
63981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6399d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6400d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
6401d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
64021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
6403d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
6404d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
6405d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
6406d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
64071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6408d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
64093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
64103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
6411d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
6412d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
64131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
6414014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
6415014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
64163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
64173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
64183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
6419014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor                                              Name,
6420a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
6421a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
64223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
6423d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
64241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6426ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
6427ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6428ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
6429ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
6430ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
6431ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6432ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
6433ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
6434ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
6435ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
6436ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
6437ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return getSema().ActOnDependentTemplateName(
6438ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6439ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              SS,
6440ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              Name,
6441a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
6442a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
6443ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor           .template getAsVal<TemplateName>();
6444ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
6445c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6446ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
64471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
6449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
6450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
6451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
6452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
6453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
6454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
6455ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
6456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
64571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
6459f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
6460f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    if (!FirstExpr->getType()->isOverloadableType() &&
6461f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl        !SecondExpr->getType()->isOverloadableType())
6462f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
6463ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                 CalleeExpr->getLocStart(),
6464f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       move(Second), OpLoc);
64651a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
64661a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
64671a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
6468f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  } else if (SecondExpr == 0 || isPostIncDec) {
6469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
6470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
6471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
64721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
6473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
64741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
6476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
64781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
6479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
6480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
6481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
6482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
64831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
6484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
6485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
6486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
64871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
6489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
6490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
6491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
64931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
6495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
64966e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
64971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6498ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
6499ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
6500ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
6501ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
6502ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
65036e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
6504ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
65056e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.addDecl(cast<DeclRefExpr>(CalleeExpr)->getDecl());
6506ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
65071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
6509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
6510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
65111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
6513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
65141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
6515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
6516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
6517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
65181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6519f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
6520ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
6521ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
6522ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(First),
6523ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(Second));
6524f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
6525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
65261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
6527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
65281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
6529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
6530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
6531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
65321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
6534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
65351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
6536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
65371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
653826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
6539c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntSema::OwningExprResult
654026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(ExprArg Base,
654126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
654226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
654326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                 NestedNameSpecifier *Qualifier,
654426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceRange QualifierRange,
654526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
654626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
6547fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
6548a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
654926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  CXXScopeSpec SS;
655026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (Qualifier) {
655126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setRange(QualifierRange);
655226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setScopeRep(Qualifier);
655326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
655426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
655526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  Expr *BaseE = (Expr *)Base.get();
655626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  QualType BaseType = BaseE->getType();
6557a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (BaseE->isTypeDependent() || Destroyed.getIdentifier() ||
655826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
6559c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      (isArrow && BaseType->getAs<PointerType>() &&
6560bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
6561bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
656226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
656326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    return SemaRef.BuildPseudoDestructorExpr(move(Base), OperatorLoc,
656426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
6565fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
6566a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
656726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
656826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
6569c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6570a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
657126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  DeclarationName Name
657226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXDestructorName(
657326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                SemaRef.Context.getCanonicalType(DestroyedType->getType()));
6574c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
657526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
6576c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
657726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
657826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
657926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
6580a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            Name, Destroyed.getLocation(),
658126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
658226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
658326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
6584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
6585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
6587