TreeTransform.h revision 7cd088e519d7e6caa4c4c12db52e0e4ae35d25c2
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
16e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Sema.h"
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h"
18dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
19c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
207cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h"
21657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
22b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
23b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
27a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h"
2819510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Ownership.h"
2919510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h"
30b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
31a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h"
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
38577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
65670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
7243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
90577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
9443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  typedef Sema::MultiStmtArg MultiStmtArg;
95c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
96577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
97577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
10760d7b3a319d84d688752be3870615ac0f111fb16John McCall  static inline ExprResult Owned(Expr *E) { return E; }
10860d7b3a319d84d688752be3870615ac0f111fb16John McCall  static inline StmtResult Owned(Stmt *S) { return S; }
1099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall
110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, returns no source-location information. Subclasses can
125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  DeclarationName Entity) : Self(Self) {
153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determine whether the given type \p T has already been
164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// to short-circuit evaluation when it is known that a given type will
168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// \brief Determine whether the given call argument should be dropped, e.g.,
1756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// because it is a default argument.
1766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  ///
1776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// Subclasses can provide an alternative implementation of this routine to
1786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// determine which kinds of call arguments get dropped. By default,
1796eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// CXXDefaultArgument nodes are dropped (prior to transformation).
1806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  bool DropCallArgument(Expr *E) {
1816eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    return E->isDefaultArgument();
1826eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  }
183c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by creating a
187a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// TypeSourceInfo for it and delegating to the appropriate
188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// function.  This is expensive, but we don't mind, because
189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// this method is deprecated anyway;  all users should be
190a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// switched to storing TypeSourceInfos.
191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
193124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType TransformType(QualType T, QualType ObjectType = QualType());
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transforms the given type-with-location into a new
196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type-with-location.
197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ///
198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by delegating to the
199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// appropriate TransformXXXType to build a new type.  Subclasses
200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// may override this function (to take over all type
201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// transformations) or some set of the TransformXXXType functions
202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// to alter the transformation.
203c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  TypeSourceInfo *TransformType(TypeSourceInfo *DI,
204124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                QualType ObjectType = QualType());
205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
210c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL,
211124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                         QualType ObjectType = QualType());
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
213657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
21643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
21743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
21843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
21943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
22043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
22143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
22260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TransformStmt(Stmt *S);
2231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
224657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
225657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
23260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult TransformExpr(Expr *E);
2331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
237dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
2397c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
24043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
24243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
24443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
245c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
246c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().TransformDecl(Loc, D);
2477c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  }
2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
252c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// This specific declaration transformation only applies to the first
2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
258c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
259c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
2606cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
261c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
265dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
266dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
268a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
269c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
270c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
27681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
27781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
2782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo
2792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
2802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               QualType ObjectType = QualType());
2811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
284d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
286d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
294670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
295670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
305a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// \brief Fakes up a TypeSourceInfo for a type.
306a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
307a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return SemaRef.Context.getTrivialTypeSourceInfo(T,
308833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
309833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
313124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T, \
314124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType = QualType());
315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms the parameters of a function type into the
31821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// given vectors.
31921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// The result vectors should be kept in sync; null entries in the
32121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// variables vector are acceptable.
32221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// Return true on error.
32421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
32521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<QualType> &PTypes,
32621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<ParmVarDecl*> &PVars);
32721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
32821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms a single function-type parameter.  Return null
32921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// on error.
33021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm);
33121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
332c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL,
333124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType);
33485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
335c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType
336dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
337dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
338833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
33960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
34060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
34360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Transform##Node(Node *S);
344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
34560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Transform##Node(Node *E);
3467381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
3474bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
35385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
35985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
36185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
37085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
37185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
37885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
37985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
40385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
40485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
41385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
41485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
4239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SizeExpr,
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *SizeExpr,
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
44382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
444788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    VectorType::AltiVecSpecific AltiVecSpec);
4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
4609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *SizeExpr,
461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
470fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    bool Variadic, unsigned Quals,
471fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    const FunctionType::ExtInfo &Info);
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
4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType RebuildTypeOfExprType(Expr *Underlying);
500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
5109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType RebuildDecltypeType(Expr *Underlying);
5111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
518833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
519d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &Args);
5201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
523465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// By default, builds a new ElaboratedType type from the keyword,
524465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// the nested-name-specifier and the named type.
525465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// Subclasses may override this routine to provide different behavior.
526465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  QualType RebuildElaboratedType(ElaboratedTypeKeyword Keyword,
527465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                 NestedNameSpecifier *NNS, QualType Named) {
528465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, NNS, Named);
5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
533e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// By default, builds a new DependentNameType type from the
534e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// nested-name-specifier and the given type. Subclasses may override
535e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// this routine to provide different behavior.
53633500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType RebuildDependentTemplateSpecializationType(
53733500955d731c73717af52088b7fc0e7a85681e7John McCall                                    ElaboratedTypeKeyword Keyword,
53833500955d731c73717af52088b7fc0e7a85681e7John McCall                                    NestedNameSpecifier *NNS,
53933500955d731c73717af52088b7fc0e7a85681e7John McCall                                    const IdentifierInfo *Name,
54033500955d731c73717af52088b7fc0e7a85681e7John McCall                                    SourceLocation NameLoc,
54133500955d731c73717af52088b7fc0e7a85681e7John McCall                                    const TemplateArgumentListInfo &Args) {
54233500955d731c73717af52088b7fc0e7a85681e7John McCall    // Rebuild the template name.
54333500955d731c73717af52088b7fc0e7a85681e7John McCall    // TODO: avoid TemplateName abstraction
54433500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateName InstName =
54533500955d731c73717af52088b7fc0e7a85681e7John McCall      getDerived().RebuildTemplateName(NNS, *Name, QualType());
54633500955d731c73717af52088b7fc0e7a85681e7John McCall
54796fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor    if (InstName.isNull())
54896fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor      return QualType();
54996fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor
55033500955d731c73717af52088b7fc0e7a85681e7John McCall    // If it's still dependent, make a dependent specialization.
55133500955d731c73717af52088b7fc0e7a85681e7John McCall    if (InstName.getAsDependentTemplateName())
55233500955d731c73717af52088b7fc0e7a85681e7John McCall      return SemaRef.Context.getDependentTemplateSpecializationType(
55333500955d731c73717af52088b7fc0e7a85681e7John McCall                                          Keyword, NNS, Name, Args);
55433500955d731c73717af52088b7fc0e7a85681e7John McCall
55533500955d731c73717af52088b7fc0e7a85681e7John McCall    // Otherwise, make an elaborated type wrapping a non-dependent
55633500955d731c73717af52088b7fc0e7a85681e7John McCall    // specialization.
55733500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType T =
55833500955d731c73717af52088b7fc0e7a85681e7John McCall      getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
55933500955d731c73717af52088b7fc0e7a85681e7John McCall    if (T.isNull()) return QualType();
560465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
56122f638a58ed05579c51ee6a35a1d16a7c2157f90Abramo Bagnara    // NOTE: NNS is already recorded in template specialization type T.
56222f638a58ed05579c51ee6a35a1d16a7c2157f90Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, /*NNS=*/0, T);
5631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
568e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// (or elaborated type). Subclasses may override this routine to provide
569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
570e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
5714a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    NestedNameSpecifier *NNS,
5724a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    const IdentifierInfo *Id,
573e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation KeywordLoc,
574e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceRange NNSRange,
575e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation IdLoc) {
5764033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    CXXScopeSpec SS;
5774033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SS.setScopeRep(NNS);
578e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    SS.setRange(NNSRange);
579e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara
5804033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (NNS->isDependent()) {
5814033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      // If the name is still dependent, just build a new dependent name type.
5824033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
5834033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return SemaRef.Context.getDependentNameType(Keyword, NNS, Id);
5844033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
5854033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
586465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (Keyword == ETK_None || Keyword == ETK_Typename)
587e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return SemaRef.CheckTypenameType(Keyword, NNS, *Id,
588e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                       KeywordLoc, NNSRange, IdLoc);
589465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
590465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
591465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
592e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    // We had a dependent elaborated-type-specifier that has been transformed
5934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // into a non-dependent elaborated-type-specifier. Find the tag we're
5944033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // referring to.
595e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
5964033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
5974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!DC)
5984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
5994033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6005613876991c80a684595fe8de1f039296a0657ffJohn McCall    if (SemaRef.RequireCompleteDeclContext(SS, DC))
6015613876991c80a684595fe8de1f039296a0657ffJohn McCall      return QualType();
6025613876991c80a684595fe8de1f039296a0657ffJohn McCall
6034033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    TagDecl *Tag = 0;
6044033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SemaRef.LookupQualifiedName(Result, DC);
6054033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    switch (Result.getResultKind()) {
6064033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFound:
6074033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFoundInCurrentInstantiation:
6084033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
609c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6104033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Found:
6114033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        Tag = Result.getAsSingle<TagDecl>();
6124033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
613c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6144033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundOverloaded:
6154033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundUnresolvedValue:
6164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        llvm_unreachable("Tag lookup cannot find non-tags");
6174033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
618c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6194033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Ambiguous:
6204033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        // Let the LookupResult structure handle ambiguities.
6214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
6224033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6234033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6244033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!Tag) {
6251eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor      // FIXME: Would be nice to highlight just the source range.
626e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
6271eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor        << Kind << Id << DC;
6284033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6294033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
630465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
631e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) {
632e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
6334033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
6344033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6354033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6364033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6374033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // Build the elaborated-type-specifier type.
6384033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    QualType T = SemaRef.Context.getTypeDeclType(Tag);
639465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
640dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
6411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
642dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
643dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
644dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
645dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
646dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
647dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
648dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
649dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
650a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
651c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
652c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
653dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
654dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
655dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
656dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
657dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
658dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
659dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
660dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
661dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
662dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
663dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
664dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
665dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
666dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
667dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
668dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
669dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
670dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
671dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
672dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
673edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  QualType T);
674d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
675d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
676d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
677d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
678d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
679d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
680d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
681d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
682d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
683d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
684d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
685d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
686d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
687d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
688d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
689d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
690d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
691d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
692d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
6933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
6943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
6951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
696ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
697ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
698ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
699ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
700ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
701ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
702ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
703ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
704ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
705ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
706c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
7159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
72360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
7249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *LHS,
72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
7269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *RHS,
72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
7289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
7379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().ActOnCaseStmtBody(S, Body);
7389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return S;
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
74560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
7479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      Stmt *SubStmt) {
7489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
75660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildLabelStmt(SourceLocation IdentLoc,
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
7599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Stmt *SubStmt) {
7609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, SubStmt);
76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
76760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
7689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 VarDecl *CondVar, Stmt *Then,
7699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 SourceLocation ElseLoc, Stmt *Else) {
7709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
77760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
7789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *Cond, VarDecl *CondVar) {
7799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
780d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                            CondVar);
78143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
78760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
7889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Stmt *Switch, Stmt *Body) {
7899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
79660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
797eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                    Sema::FullExprArg Cond,
79899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
7999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Stmt *Body) {
8009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
80760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
8109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 Expr *Cond,
81143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
8129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
8139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 Cond, RParenLoc);
81443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
81543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
81643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
81743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
81843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
81943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
82060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildForStmt(SourceLocation ForLoc,
82143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
8229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Stmt *Init, Sema::FullExprArg Cond,
82399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
8249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  SourceLocation RParenLoc, Stmt *Body) {
8259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
826d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                  CondVar,
8279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Inc, RParenLoc, Body);
82843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto 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.
83460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildGotoStmt(SourceLocation GotoLoc,
83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
83643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
83743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
83943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
84043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
84143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
84243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
84343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
84460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
84543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
8469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *Target) {
8479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
84843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
85143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
85243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
85343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
85460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
8559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *Result) {
8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnReturnStmt(ReturnLoc, Result);
85843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
86143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
86243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
86343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
86460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
86643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
86743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
86843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
86943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
87043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
87143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
87243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
874703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
875703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
876703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
877703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
87860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildAsmStmt(SourceLocation AsmLoc,
879703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
880703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
882703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
883ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
884703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
885703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
8869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Expr *AsmString,
887703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
889703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
890c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
891703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
8929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Exprs, AsmString, Clobbers,
893703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
894703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
8954dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
8964dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @try statement.
8974dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
8984dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
8994dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
90060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
9019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *TryBody,
9028f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                        MultiStmtArg CatchStmts,
9039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *Finally) {
9049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts),
9059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Finally);
9064dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
9074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
908be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Rebuild an Objective-C exception declaration.
909be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
910be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new declaration.
911be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
912be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
913be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                    TypeSourceInfo *TInfo, QualType T) {
914c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildObjCExceptionDecl(TInfo, T,
915c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                            ExceptionDecl->getIdentifier(),
916be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                            ExceptionDecl->getLocation());
917be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
918c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
919be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Build a new Objective-C @catch statement.
920be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
921be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
922be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
92360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
924be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          SourceLocation RParenLoc,
925be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          VarDecl *Var,
9269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Stmt *Body) {
927be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
9289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Var, Body);
929be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
930c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9314dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @finally statement.
9324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
9334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
93560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
9369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Stmt *Body) {
9379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
9384dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
939c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9408fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @throw statement.
941d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  ///
942d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
943d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
94460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
9459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *Operand) {
9469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
947d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
948c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9498fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @synchronized statement.
9508fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  ///
9518fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
9528fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
95360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
9549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *Object,
9559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Stmt *Body) {
9569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object,
9579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Body);
9588fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  }
959c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor
960c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// \brief Build a new Objective-C fast enumeration statement.
961c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  ///
962c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
963c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
96460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
965c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation LParenLoc,
9669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Stmt *Element,
9679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Expr *Collection,
968c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation RParenLoc,
9699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Stmt *Body) {
970c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
9719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Element,
9729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Collection,
973c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                RParenLoc,
9749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Body);
975c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  }
976c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
97743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
97843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
97943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
98043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
982a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
98343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
98443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
98543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
9861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
98743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
98843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
98943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
99043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
99143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
99243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
99343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
99460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
99543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
9969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       Stmt *Handler) {
9979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
9989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Handler));
99943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
100243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
100343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
100443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
100560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
10069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Stmt *TryBlock,
100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
10089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers));
100943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
101560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1016f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              LookupResult &R,
1017f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              bool RequiresADL) {
1018f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1019f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
1020f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1021f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1022f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
1023f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
1024f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
1025f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
102660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
1027a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
10282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                      ValueDecl *VD,
10292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                      const DeclarationNameInfo &NameInfo,
1030dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      TemplateArgumentListInfo *TemplateArgs) {
1031a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
1032a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
1033a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
1034dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
1035dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
10362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
10372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
10411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
104460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
10469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1049a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1051a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1052a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
105360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1054a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
1055a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
1056a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                NestedNameSpecifier *Qualifier,
105726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceRange QualifierRange,
105826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  TypeSourceInfo *ScopeType,
105926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceLocation CCLoc,
1060fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                  SourceLocation TildeLoc,
1061a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
10621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
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.
106760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
10699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *SubExpr) {
10709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr);
1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Build a new builtin offsetof expression.
10748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ///
10758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
10768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
107760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
10788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       TypeSourceInfo *Type,
10798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       Action::OffsetOfComponent *Components,
10808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       unsigned NumComponents,
10818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       SourceLocation RParenLoc) {
10828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
10838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          NumComponents, RParenLoc);
10848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1085c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
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.
109060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
10915ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
1093a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
110160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildSizeOfAlignOf(Expr *SubExpr, SourceLocation OpLoc,
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
110360d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
11049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      = getSema().CreateSizeOfAlignOfExpr(SubExpr, OpLoc, isSizeOf, R);
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
11121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
111560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
11179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *RHS,
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
11199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS,
11209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             LBracketLoc, RHS,
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
112860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
11329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc,
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access 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.
114060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
114283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
114383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
11442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                     const DeclarationNameInfo &MemberNameInfo,
1145f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                                     ValueDecl *Member,
11466bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                     NamedDecl *FoundDecl,
1147d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
11488a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
1149d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
1150d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
1151d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
11521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      if (getSema().PerformObjectMemberConversion(Base, Qualifier,
11546bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                                  FoundDecl, Member))
115583a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        return getSema().ExprError();
11568aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
11571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
11589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        new (getSema().Context) MemberExpr(Base, isArrow,
11592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                           Member, MemberNameInfo,
1160d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
1161d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
1162d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
11631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
116583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
116683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
116783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
116883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
116983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
11709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().DefaultFunctionArrayConversion(Base);
11719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    QualType BaseType = Base->getType();
1172aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
11736bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // FIXME: this involves duplicating earlier analysis in a lot of
11746bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // cases; we should avoid this when possible.
11752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
11766bb8017bb9e828d118e15e59d71c66bba323c364John McCall    R.addDecl(FoundDecl);
1177c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1178c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
11799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1180129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1181c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
11851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
118860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
11909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *LHS, Expr *RHS) {
11919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS);
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
11951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
119860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildConditionalOperator(Expr *Cond,
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
12009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *LHS,
1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
12029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *RHS) {
12039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
12049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        LHS, RHS);
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
12081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
121160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
12129d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
12149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *SubExpr) {
1215b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
12169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubExpr);
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
122360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
122442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
12269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Init) {
122742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
12289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Init);
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
12321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
123560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildExtVectorElementExpr(Expr *Base,
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1239aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1240129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
12412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
12429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1243129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1244129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
12452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                              NameInfo,
1246129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
12501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
125360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildInitList(SourceLocation LBraceLoc,
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1255e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1256e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
125760d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
1258e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1259e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1260e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1261c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1262e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1263e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1264e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1265e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1266e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
12701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
127360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
12779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *Init) {
127860d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
12809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Init);
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
12891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
129360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildImplicitValueInitExpr(QualType T) {
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
12981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
130160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
13029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SubExpr, TypeSourceInfo *TInfo,
13032cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    SourceLocation RParenLoc) {
13042cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara    return getSema().BuildVAArgExpr(BuiltinLoc,
13059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    SubExpr, TInfo,
13062cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    RParenLoc);
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
13101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
131360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1316c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1317f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
132560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
13321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
133560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
13369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Stmt *SubStmt,
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
13389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
134560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
13463fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TypeSourceInfo *TInfo1,
13473fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TypeSourceInfo *TInfo2,
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
13493fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara    return getSema().BuildTypesCompatibleExpr(BuiltinLoc,
13503fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TInfo1, TInfo2,
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
135860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
13599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *Cond, Expr *LHS, Expr *RHS,
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
13629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Cond, LHS, RHS,
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
13711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
137460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
13769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Callee,
13779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *First,
13789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Second);
13791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
13841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
138660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
13899d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
13929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
13969d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
13971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
13989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
14019d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
14039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    SubExpr, RParenLoc);
14041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
14069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
14071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
14089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                        SubExpr,
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
14101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
14129d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
14149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
14151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
14201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
142860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
14309d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
14339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Expr *SubExpr,
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1435c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
14369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1437c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1438c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
144560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
14479d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
14509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *SubExpr,
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1452c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
14539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1454c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1455c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
146260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
14649d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
14679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SubExpr,
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1469c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
14709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1471c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1472c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
147960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
14819d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
14849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1486c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
14879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1488c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1489c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
149660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
14979d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                TypeSourceInfo *TInfo,
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
14999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Expr *Sub,
1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1502b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                             ParsedType::make(TInfo->getType()),
1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
150488650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
15051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
151360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
151457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
151557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        TypeSourceInfo *Operand,
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1517c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
151857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
152560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
152657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
15279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand,
1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
15299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
153057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
15311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
15321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
153860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1539828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1540828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1542828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1543828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
155060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub) {
15519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXThrow(ThrowLoc, Sub);
1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
155960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1560036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1561036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1562036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
156960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXScalarValueInitExpr(SourceLocation TypeStartLoc,
1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
15731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1574b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                               ParsedType::make(T), LParenLoc,
15751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
158360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
15884bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                     SourceRange TypeIdParens,
1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
15929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *ArraySize,
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
15961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
16004bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                 TypeIdParens,
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
16049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 ArraySize,
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
161460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
16179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand) {
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
16199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Operand);
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
162660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
16311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1632b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                         ParsedType::make(T), RParenLoc);
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
16351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
164060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
16422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                       const DeclarationNameInfo &NameInfo,
1643f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1647f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1648f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
16492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo,
1650f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
16522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo);
1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
165960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1662d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
167060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXConstructExpr(QualType T,
16714411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
16748c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           MultiExprArg Args,
16758c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           bool RequiresZeroInit,
16768c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                             CXXConstructExpr::ConstructionKind ConstructKind) {
1677ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> ConvertedArgs(SemaRef);
1678c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
16794411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
16804411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor      return getSema().ExprError();
1681c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
16824411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
16838c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           move_arg(ConvertedArgs),
16848c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           RequiresZeroInit, ConstructKind);
1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
169160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1698b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                               ParsedType::make(T),
1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
170960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1717b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                               ParsedType::make(T),
1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
172860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
1729aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1732a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1733a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1734129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
17352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                   const DeclarationNameInfo &MemberNameInfo,
1736129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1738a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1739a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
17401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
1742aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1743129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
17442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            MemberNameInfo,
17452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            TemplateArgs);
1746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1748129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
17493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
17503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
17513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
175260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE,
1753aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1754129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1755129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1756129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1757129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1758c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1759129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1760129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
17613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
17623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
17633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
17641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
1766aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1767c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1768c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
17693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
17701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
177560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
177681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                         TypeSourceInfo *EncodeTypeInfo,
1777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
177881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
1779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
17801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
178292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C class message.
178360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
178492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
178592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1786c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
178792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
178892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
178992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
179092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     ReceiverTypeInfo->getType(),
179192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     /*SuperLoc=*/SourceLocation(),
1792f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                     Sel, Method, LBracLoc, RBracLoc,
179392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     move(Args));
179492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
179592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
179692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C instance message.
179760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCMessageExpr(Expr *Receiver,
179892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
179992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1800c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
180192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
180292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
18039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildInstanceMessage(Receiver,
18049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Receiver->getType(),
180592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        /*SuperLoc=*/SourceLocation(),
1806f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                        Sel, Method, LBracLoc, RBracLoc,
180792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        move(Args));
180892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
180992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
1810f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C ivar reference expression.
1811f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1812f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1813f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
181460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
1815f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          SourceLocation IvarLoc,
1816f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          bool IsArrow, bool IsFreeIvar) {
1817f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    // FIXME: We lose track of the IsFreeIvar bit.
1818f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
18199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1820f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
1821f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
182260d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1823f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IvarLoc,
1824d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0,
1825ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
1826f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1827f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1828c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1829f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1830f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1831c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
18329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1833c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IvarLoc, IsArrow, SS,
1834f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1835c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1836f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1837f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1838e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor
1839e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// \brief Build a new Objective-C property reference expression.
1840e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  ///
1841e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1842e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
184360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
1844e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              ObjCPropertyDecl *Property,
1845e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              SourceLocation PropertyLoc) {
1846e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    CXXScopeSpec SS;
18479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1848e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
1849e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                   Sema::LookupMemberName);
1850e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    bool IsArrow = false;
185160d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1852e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         /*FIME:*/PropertyLoc,
1853d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
1854e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.isInvalid())
1855e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return getSema().ExprError();
1856c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1857e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.get())
1858e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return move(Result);
1859c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
18609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1861c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/PropertyLoc, IsArrow,
1862c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              SS,
1863e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*FirstQualifierInScope=*/0,
1864c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1865e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*TemplateArgs=*/0);
1866e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  }
1867c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1868c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// \brief Build a new Objective-C implicit setter/getter reference
18699cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// expression.
18709cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  ///
18719cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1872c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// Subclasses may override this routine to provide different behavior.
187360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCImplicitSetterGetterRefExpr(
18749cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Getter,
18759cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          QualType T,
18769cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Setter,
18779cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        SourceLocation NameLoc,
18789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                          Expr *Base) {
18799cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // Since these expressions can only be value-dependent, we do not need to
18809cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // perform semantic analysis again.
18819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(
18829cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
18839cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     Setter,
18849cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     NameLoc,
18859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                                     Base));
18869cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  }
18879cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor
1888f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C "isa" expression.
1889f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1890f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1891f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
189260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
1893f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                      bool IsArrow) {
1894f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
18959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1896f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
1897f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
189860d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1899f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IsaLoc,
1900d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
1901f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1902f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1903c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1904f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1905f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1906c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
19079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1908c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IsaLoc, IsArrow, SS,
1909f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1910c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1911f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1912f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1913c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
191860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
19221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
19271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
19301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
19320da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
19341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
19405291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor                                                   Builtin->getCallResultType(),
1941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
194260d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult OwnedCall(SemaRef.Owned(TheCall));
19431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
194560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
19481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
19501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1952577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
195443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
195560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
195643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
195743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
19581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
195943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
196043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
19611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
196343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
196443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
196543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
19664bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
196943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
19707381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
197143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
19724bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
197343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
197460d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
197543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
197643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
19771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take()));
197943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
19801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
19811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
198243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
198343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
19841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1986670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
198760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
1988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
19947381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
1995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1996454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
19974bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
19991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2001657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
2002657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
2003657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
2004dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
2005dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
2006a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
2007c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
2008c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
20090979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
20100979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
20111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
201243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
2013dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
2014dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
20151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
2016c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
2017c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
2018dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
2019dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
20201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
2022c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
2023a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
2024c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
2025dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2027dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
2028dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
20291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
2030a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
2031a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
2032a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
2033dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2036a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
2037c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
2038c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2040dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
20411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
2042dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
20437c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
20447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       NNS->getAsNamespace()));
20451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
2046dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2047dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
2048dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2050dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2051dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2053dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
2054dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
2055dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
2056dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
20571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2058dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
2059dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
2060fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2061124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
2062124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
2063d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
2064d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
20651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2066dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
2067dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2068dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
2069dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
20721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2073edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   T);
2074dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
2075dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2077dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
20781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
2079dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
2080dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
2081dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
20822577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameInfo
20832577743c5650c646fb705df01403707e94f2df04Abramo BagnaraTreeTransform<Derived>
20842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
20852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               QualType ObjectType) {
20862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name = NameInfo.getName();
208781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
20882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return DeclarationNameInfo();
208981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
209081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
209181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
209281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
209381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
209481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
209581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
20963e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
209781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
20982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NameInfo;
20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
210081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
210181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
210281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
21032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    TypeSourceInfo *NewTInfo;
21042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CanQualType NewCanTy;
21052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
21062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       NewTInfo = getDerived().TransformType(OldTInfo, ObjectType);
21072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       if (!NewTInfo)
21082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara         return DeclarationNameInfo();
21092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
21102577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
21112577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    else {
21122577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewTInfo = 0;
21132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
21142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      QualType NewT = getDerived().TransformType(Name.getCXXNameType(),
21152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                 ObjectType);
21162577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      if (NewT.isNull())
21172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        return DeclarationNameInfo();
21182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewCanTy = SemaRef.Context.getCanonicalType(NewT);
21192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
21201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName NewName
21222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
21232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                           NewCanTy);
21242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NewNameInfo(NameInfo);
21252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setName(NewName);
21262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setNamedTypeInfo(NewTInfo);
21272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NewNameInfo;
212881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
21291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
21301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(0 && "Unknown name kind.");
21322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return DeclarationNameInfo();
213381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
213481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
213581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
21361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
21373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
21383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
21397c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  SourceLocation Loc = getDerived().getBaseLocation();
21407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor
2141d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
21421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2143d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
2144124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2145124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
2146d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
2147d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2149d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
21501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
21517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2152d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
2153d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
21541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2155d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
2156d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
2157d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
2158d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
21591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2160d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
2161d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
2162d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
21631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2164f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
2165f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
2166d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2168d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
21691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2170d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
2171124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2172124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
21733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
2174d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2176d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2177dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
2178dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
2179d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2181ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
2182c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
2183ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
2184c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2185c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
2186ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
2187d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2189d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
21901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
21917c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2192d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
2193d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2195d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2196d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
2197d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2199d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
2200d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
22011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2202f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
2203f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
2204f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
2205d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
2206d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
2207d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
2208833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
2209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
2210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2211833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
2212670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
2213670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
22149f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
2215833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2216833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2217833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
2218833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
2219a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2220c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2221833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2223788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
2224788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
2225788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
2226c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2227833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
2228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
2232670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
2233833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
2234828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2235833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2237833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
2241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
2242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2243833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
2244833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
2245833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
2246833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
2247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
2248833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
22491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2250670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
2251a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2252833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
2253a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2254833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2255833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
2256833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
2257833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2258833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2259833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2260670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2262670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
2263833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
2264972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
2265972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2266972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
2267788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
22687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2269833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
2270833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2271828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
2272828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
2273828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
2274828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
227560d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult E = getDerived().TransformExpr(SourceExpr);
22769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      SourceExpr = (E.isInvalid() ? 0 : E.take());
2277828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
2278828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2279828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2280833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2281670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2283788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
2284c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
2285788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
2286788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
2287788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
2288788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
2289c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2290788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
2291788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
2292788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
2293788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
2294788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
2295c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2296670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
2297670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
22981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
2299670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
23001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
2302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
230460d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult E
2305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
23079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take());
2308833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2309670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2311670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2312670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2313670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
23141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2315670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2316670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
23171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2321828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2322828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2323828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2324828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2325833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2326833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2327828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2328670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2329670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
23301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2331670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2332828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2333833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2334670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2335670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2337670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2338833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2339670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2340670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2346c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntQualType TreeTransform<Derived>::TransformType(QualType T,
2347124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
23501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2353a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
23544802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2355c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2356124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
23571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
23601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2365124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2366124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
23691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
23711bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
23741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2375124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
23781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2379a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2384124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2385124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2390124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2391124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
23959f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
24041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2407124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualifiedTypeLoc T,
2408124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2409a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2411124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2412124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
24211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24222865474261a608c7873b87ba4af110d17907896dJohn McCall  if (!Quals.empty()) {
24232865474261a608c7873b87ba4af110d17907896dJohn McCall    Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
24242865474261a608c7873b87ba4af110d17907896dJohn McCall    TLB.push<QualifiedTypeLoc>(Result);
24252865474261a608c7873b87ba4af110d17907896dJohn McCall    // No location information to preserve.
24262865474261a608c7873b87ba4af110d17907896dJohn McCall  }
2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2440124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      BuiltinTypeLoc T,
2441124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2442ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2443ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
2444ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
2445ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2446ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
2447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2451124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      ComplexTypeLoc T,
2452124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
24561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2459c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                      PointerTypeLoc TL,
2460124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2461c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType PointeeType
2462c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
246392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType.isNull())
246492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return QualType();
246592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
246692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  QualType Result = TL.getType();
2467c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (PointeeType->getAs<ObjCObjectType>()) {
246892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // A dependent pointer type 'T *' has is being transformed such
246992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // that an Objective-C class type is being replaced for 'T'. The
247092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // resulting pointer type is an ObjCObjectPointerType, not a
247192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // PointerType.
2472c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
2473c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2474c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
2475c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    NewT.setStarLoc(TL.getStarLoc());
247692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Result;
247792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2478c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
247992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (getDerived().AlwaysRebuild() ||
248092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      PointeeType != TL.getPointeeLoc().getType()) {
248192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
248292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Result.isNull())
248392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return QualType();
248492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
248692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
248792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2488c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Result;
2489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2494124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  BlockPointerTypeLoc TL,
2495124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  QualType ObjectType) {
2496db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  QualType PointeeType
2497c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2498c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (PointeeType.isNull())
2499c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return QualType();
2500c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2501c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType Result = TL.getType();
2502c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (getDerived().AlwaysRebuild() ||
2503c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      PointeeType != TL.getPointeeLoc().getType()) {
2504c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildBlockPointerType(PointeeType,
2505db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor                                                  TL.getSigilLoc());
2506db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor    if (Result.isNull())
2507db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor      return QualType();
2508db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  }
2509db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor
251039968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
2511db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2512db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  return Result;
2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
251585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
251685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
251785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
251885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
251985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
252085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
252185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2522124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ReferenceTypeLoc TL,
2523124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
252485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
252585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
252685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
252785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
252885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
252985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
253085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
253185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
253285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
253385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
253485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
253585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
253685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
253785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
253885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
253985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
254085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
254185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
254285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
254385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
254485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
254585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
254685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
254785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
254885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
254985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
255085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
255185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2555124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 LValueReferenceTypeLoc TL,
2556124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2557124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2563124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 RValueReferenceTypeLoc TL,
2564124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2565124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
25691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2571124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   MemberPointerTypeLoc TL,
2572124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
258985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
259085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
26011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
26021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2604124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ConstantArrayTypeLoc TL,
2605124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
261785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
261885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2622c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
26261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2640124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              IncompleteArrayTypeLoc TL,
2641124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              QualType ObjectType) {
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
265285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
265385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2657c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2669124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   VariableArrayTypeLoc TL,
2670124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2676670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2677670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2678670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
267960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SizeResult
2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Size = SizeResult.take();
2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
26929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Size,
2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
269485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2697577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2698c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
27031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2710124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                             DependentSizedArrayTypeLoc TL,
2711124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2717670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2718670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
27191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
272060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SizeResult
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
27339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                         Size,
2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
273585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
27401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2749577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2752577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2754124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      DependentSizedExtVectorTypeLoc TL,
2755124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2759577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2760577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2761577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2763670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2764670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2765670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
276660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2767577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2772eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2773eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2774a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
27759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                             Size.take(),
2776577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2789a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2792577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2796124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     VectorTypeLoc TL,
2797124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2798a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2799577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2800577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2801577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2802577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2803a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2804a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2805a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
280682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
2807788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      T->getAltiVecSpecific());
2808a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2810a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2811c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2812a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2815a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2819a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2820124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        ExtVectorTypeLoc TL,
2821124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2822a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2823577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2828a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2829a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2830a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2831a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2833a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2835a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2836c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2837a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2838a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2840a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2841577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2842577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
284421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
284521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
284621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
284721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
284821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
284921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
285021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
285121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
285221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
285321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
285421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
285521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
285621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
285721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
285821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
285921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
286021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
286116573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                               OldParm->getStorageClassAsWritten(),
286221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
286321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
286421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
286521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
286621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
286721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
286821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<QualType> &PTypes,
286921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2870a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
28711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2874a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2878a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
287921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
288021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
288121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2882a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2883a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2884a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2885a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2886a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
289221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
28941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
289521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PTypes.push_back(NewType);
289621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PVars.push_back(NewParm);
2897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
28981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
289921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
290021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
290121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
290221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
290321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
290421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
290521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   FunctionProtoTypeLoc TL,
290621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   QualType ObjectType) {
2907895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // Transform the parameters. We do this first for the benefit of template
2908895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiations, so that the ParmVarDecls get/ placed into the template
2909895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiation scope before we transform the function type.
291021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
291121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
291221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
291321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return QualType();
2914c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2915895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  FunctionProtoType *T = TL.getTypePtr();
2916895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2917895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  if (ResultType.isNull())
2918895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor    return QualType();
2919c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2920a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2921a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2922a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2923a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2924a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2925a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2926a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2928fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getTypeQuals(),
2929fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getExtInfo());
2930a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
29331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2939a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2946124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 FunctionNoProtoTypeLoc TL,
2947124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 QualType ObjectType) {
2948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2952a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2954a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2955a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2956a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2957a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2959a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2960a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2961a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2962a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2965ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2966ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2967124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 UnresolvedUsingTypeLoc TL,
2968124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2969ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
29707c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2971ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
2972ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
2973ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2974ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
2975ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2976ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
2977ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
2978ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
2979ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
2980ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2981ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
2982ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
2983ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2984ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
2985ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2986ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
2987ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
2988ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2991124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypedefTypeLoc TL,
2992124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2993a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
29957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
29967c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
2997577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
29991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3000a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3001a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3002a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
3003a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
3004a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3005a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3007a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3008a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
3009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3011a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3012577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3015a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
3016124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypeOfExprTypeLoc TL,
3017124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3018670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
3019670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3027cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
30289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Result = getDerived().RebuildTypeOfExprType(E.get());
3029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3032a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
30331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3034a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3035cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3036cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3037cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3038a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3040577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
3044124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     TypeOfTypeLoc TL,
3045124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3046cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3047cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3048cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
3049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3052cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3053cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
30571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3059cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3060cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3061cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3062cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
3063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
3069124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       DecltypeTypeLoc TL,
3070124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
3072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3073670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
3074670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
307660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
3077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3080a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
30839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Result = getDerived().RebuildDecltypeType(E.get());
3084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
3088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
3090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3094577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3095577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
3097124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     RecordTypeLoc TL,
3098124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
3100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
31017c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31027c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
3103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
3104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
3109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
3110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
31131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
3115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
3122124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   EnumTypeLoc TL,
3123124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
3125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
31267c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31277c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
3128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
3129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
3134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
3135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
3140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3142a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31447da2431c23ef1ee8acb114e39692246e1801afc2John McCall
31453cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
31463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
31473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
31483cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         InjectedClassNameTypeLoc TL,
31493cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         QualType ObjectType) {
31503cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
31513cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
31523cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
31533cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31543cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
31553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
31563cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
31573cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
31583cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
3162a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
3163124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                TemplateTypeParmTypeLoc TL,
3164124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                QualType ObjectType) {
3165a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
3166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
316949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
3170a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
3171124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         SubstTemplateTypeParmTypeLoc TL,
3172124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         QualType ObjectType) {
3173a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
317449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
317549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
317649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
3177833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3178833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
3179833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3180833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
3181833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
3182a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3183833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
3184833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
3185833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
3186833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
3187833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3188828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
3189828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
3190828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
3191828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
3192828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
3193833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3194833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
3195833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
3196833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
3197833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
3198833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3199833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3200833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
3201833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
3202dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
3203c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3204dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
3205577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3206833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
3207833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
3208833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
3210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
32111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
3212dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
3213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
3214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
32151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3216d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
3217d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3218d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3219d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
3220d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
3221d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
3222d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
3223577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
3224d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
3225d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
32261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3227833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
3228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
3230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
3231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
3232d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
32331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3234833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
3235833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
3236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
3237833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
3238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
3239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
3240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
3241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
3242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
32431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3244833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
3245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3248a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3249465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
3250465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                ElaboratedTypeLoc TL,
3251465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                QualType ObjectType) {
3252465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType *T = TL.getTypePtr();
3253465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
3254465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  NestedNameSpecifier *NNS = 0;
3255465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  // NOTE: the qualifier in an ElaboratedType is optional.
3256465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  if (T->getQualifier() != 0) {
3257465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3258e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                    TL.getQualifierRange(),
3259465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                    ObjectType);
3260465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (!NNS)
3261465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return QualType();
3262465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
32631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3264e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType NamedT;
3265e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // FIXME: this test is meant to workaround a problem (failing assertion)
3266e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // occurring if directly executing the code in the else branch.
3267e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (isa<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc())) {
3268e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc OldNamedTL
3269e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = cast<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc());
3270e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    const TemplateSpecializationType* OldTST
32719cbb4d81b98ee84795e267d51c1fa530ef6723bfJim Grosbach      = OldNamedTL.getType()->template getAs<TemplateSpecializationType>();
3272e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = TransformTemplateSpecializationType(OldTST, ObjectType);
3273e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3274e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3275e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc NewNamedTL
3276e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
3277e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewNamedTL.copy(OldNamedTL);
3278e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3279e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  else {
3280e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
3281e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3282e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3283e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3284a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar
3285a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
3288e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      NamedT != T->getNamedType()) {
3289e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, NamedT);
3290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3294465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3295e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setKeywordLoc(TL.getKeywordLoc());
3296e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setQualifierRange(TL.getQualifierRange());
3297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33024714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
33034714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor                                                       DependentNameTypeLoc TL,
3304124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
33054714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T = TL.getTypePtr();
3306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
3308e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3309e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                TL.getQualifierRange(),
3310edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                ObjectType);
3311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
3312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331433500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result
331533500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
331633500955d731c73717af52088b7fc0e7a85681e7John McCall                                            T->getIdentifier(),
331733500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getKeywordLoc(),
331833500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getQualifierRange(),
331933500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getNameLoc());
3320a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
3322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3323e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
3324e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    QualType NamedT = ElabT->getNamedType();
332533500955d731c73717af52088b7fc0e7a85681e7John McCall    TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
332633500955d731c73717af52088b7fc0e7a85681e7John McCall
3327e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3328e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3329e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
333033500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3331e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
3332e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3333e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
3334e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setNameLoc(TL.getNameLoc());
3335e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
334033500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>::
334133500955d731c73717af52088b7fc0e7a85681e7John McCall          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
334233500955d731c73717af52088b7fc0e7a85681e7John McCall                                 DependentTemplateSpecializationTypeLoc TL,
334333500955d731c73717af52088b7fc0e7a85681e7John McCall                                                       QualType ObjectType) {
334433500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType *T = TL.getTypePtr();
334533500955d731c73717af52088b7fc0e7a85681e7John McCall
334633500955d731c73717af52088b7fc0e7a85681e7John McCall  NestedNameSpecifier *NNS
334733500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
334833500955d731c73717af52088b7fc0e7a85681e7John McCall                                                TL.getQualifierRange(),
334933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ObjectType);
335033500955d731c73717af52088b7fc0e7a85681e7John McCall  if (!NNS)
335133500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
335233500955d731c73717af52088b7fc0e7a85681e7John McCall
335333500955d731c73717af52088b7fc0e7a85681e7John McCall  TemplateArgumentListInfo NewTemplateArgs;
335433500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
335533500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
335633500955d731c73717af52088b7fc0e7a85681e7John McCall
335733500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = T->getNumArgs(); I != E; ++I) {
335833500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateArgumentLoc Loc;
335933500955d731c73717af52088b7fc0e7a85681e7John McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(I), Loc))
336033500955d731c73717af52088b7fc0e7a85681e7John McCall      return QualType();
336133500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTemplateArgs.addArgument(Loc);
336233500955d731c73717af52088b7fc0e7a85681e7John McCall  }
336333500955d731c73717af52088b7fc0e7a85681e7John McCall
336433500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
336533500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getKeyword(),
336633500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NNS,
336733500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getIdentifier(),
336833500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     TL.getNameLoc(),
336933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NewTemplateArgs);
337033500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Result.isNull())
337133500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
337233500955d731c73717af52088b7fc0e7a85681e7John McCall
337333500955d731c73717af52088b7fc0e7a85681e7John McCall  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
337433500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType NamedT = ElabT->getNamedType();
337533500955d731c73717af52088b7fc0e7a85681e7John McCall
337633500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the template specialization.
337733500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateSpecializationTypeLoc NamedTL
337833500955d731c73717af52088b7fc0e7a85681e7John McCall      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
337933500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setLAngleLoc(TL.getLAngleLoc());
338033500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setRAngleLoc(TL.getRAngleLoc());
338133500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
338233500955d731c73717af52088b7fc0e7a85681e7John McCall      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
338333500955d731c73717af52088b7fc0e7a85681e7John McCall
338433500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the elaborated type.
338533500955d731c73717af52088b7fc0e7a85681e7John McCall    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
338633500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setKeywordLoc(TL.getKeywordLoc());
338733500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setQualifierRange(TL.getQualifierRange());
338833500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3389e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TypeLoc NewTL(Result, TL.getOpaqueData());
3390e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TLB.pushFullCopy(NewTL);
339133500955d731c73717af52088b7fc0e7a85681e7John McCall  }
339233500955d731c73717af52088b7fc0e7a85681e7John McCall  return Result;
339333500955d731c73717af52088b7fc0e7a85681e7John McCall}
339433500955d731c73717af52088b7fc0e7a85681e7John McCall
339533500955d731c73717af52088b7fc0e7a85681e7John McCalltemplate<typename Derived>
3396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3398124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ObjCInterfaceTypeLoc TL,
3399124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3400ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCInterfaceType is never dependent.
3401c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3402c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return TL.getType();
3403c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3404c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
3405c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived>
3406c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType
3407c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
3408c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                ObjCObjectTypeLoc TL,
3409c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                QualType ObjectType) {
3410c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCObjectType is never dependent.
3411c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3412ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
3413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3418124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjCObjectPointerTypeLoc TL,
3419124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3420ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCObjectPointerType is never dependent.
3421c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3422ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
342324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
342424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
342960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
34301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
34311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
343843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
344160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
34421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
344343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
344443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
3445ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Statements(getSema());
344643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
344743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
344860d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Result = getDerived().TransformStmt(*B);
344943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
34511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
346143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
346343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
346443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
346760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
34681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
346960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS, RHS;
3470264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3471264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3472264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3474264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3475264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3476264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3477264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
34781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3479264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3480264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3481264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3482264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3483264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
34841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
348543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
348643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
348743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
348860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
34899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       LHS.get(),
349043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
34919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       RHS.get(),
349243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
349343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
349443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
349760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
349843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
349943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
35029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
350343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
350443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
350543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
350660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
35071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
350843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
350960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
351043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
351143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
351443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
35159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubStmt.get());
351643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
351960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
35201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
352160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
352243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
352343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
352643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
352743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
35289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SubStmt.get());
352943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
353143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
353260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
35331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
353443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
353560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
35368cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
35378cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
3538c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
35398cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
3540aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3541aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3542aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
35438cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
35448cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
354599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
35468cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3547c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
354899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
354999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3550eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
3551eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    // Convert the condition to a boolean value.
3552afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
355360d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult CondE = getSema().ActOnBooleanCondition(0,
3554afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getIfLoc(),
35559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3556afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3557afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3558eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
35599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE.get();
3560afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
356199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
3562c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
35639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
35649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
3565eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3566eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
356743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
356860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Then = getDerived().TransformStmt(S->getThen());
356943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
357043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
357360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Else = getDerived().TransformStmt(S->getElse());
357443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
357543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
35789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
357999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
358043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
358143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
35821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
35831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3584eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
35859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Then.get(),
35869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    S->getElseLoc(), Else.get());
358743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
358843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
358943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
359060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
35911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
359243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
359360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
3594d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3595d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3596c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
3597d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3598aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3599aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3600aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
3601d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3602d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
360399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3604d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3605c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
360699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
360799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
360899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
361160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Switch
36129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
3613586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          ConditionVar);
361443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
361543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
361860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
361943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
362043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
36239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
36249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Body.get());
362543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
362860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
36291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
363043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
363160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
36325656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
36335656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
3634c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
36355656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
3636aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3637aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3638aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
36395656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
36405656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
364199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
36425656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3643c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
364499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
364599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3646afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3647afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3648afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
364960d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult CondE = getSema().ActOnBooleanCondition(0,
3650eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                                             S->getWhileLoc(),
36519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3652afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3653afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
36549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE;
3655afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
365699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
36599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
3660eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3661eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
366243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
366360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
366443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
366543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
366743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
36689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
366999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
367043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(S);
36721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3673eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
36749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       ConditionVar, Body.get());
367543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
367743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
367860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
367943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
368043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
368160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
368243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
368343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3685eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  // Transform the condition
368660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(S->getCond());
3687eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (Cond.isInvalid())
3688eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3689eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
369043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
369143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
369243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
36969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    /*FIXME:*/S->getWhileLoc(), Cond.get(),
369743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
369843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
370160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
370343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
370460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Init = getDerived().TransformStmt(S->getInit());
370543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
370643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
370960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
371099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
371199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
3712c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
371399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
3714aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3715aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3716aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
371799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
371899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
371999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
372099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3721c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
372299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
372399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3724afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3725afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3726afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
372760d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult CondE = getSema().ActOnBooleanCondition(0,
3728afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getForLoc(),
37299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3730afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3731afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3732afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
37339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE.get();
3734afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
373599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
37389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
3739eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3740eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
374143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
374260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Inc = getDerived().TransformExpr(S->getInc());
374343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
374443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get()));
37479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (S->getInc() && !FullInc.get())
3748eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3749eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
375043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
375160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
375243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
375343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
375543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
375643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
37579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
375843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
375943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
37611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
376243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
37639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Init.get(), FullCond, ConditionVar,
37649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     FullInc, S->getRParenLoc(), Body.get());
376543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
376643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
376743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
376860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
377043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
37711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
377243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
377343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
377443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
377543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
377660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
377860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Target = getDerived().TransformExpr(S->getTarget());
377943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
378043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
378243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
378343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
37841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
378543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
378643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
37879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Target.get());
378843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
378943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
379043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
379160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
37931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
379443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
379643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
379760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
37991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
380043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
380243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
380360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
38041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
380560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Result = getDerived().TransformExpr(S->getRetValue());
380643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
380743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
380843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
38091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
381043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
38119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
381243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
381443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
381560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
38161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
381743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
381843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
381943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
382043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
3821aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
3822aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                         *D);
382343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
382443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
38251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
382743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
383043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
38311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
38341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
383643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
383743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
384060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
38411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
384243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
38431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
384443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
384543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
384643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
384760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
384843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3849c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3850ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Constraints(getSema());
3851ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Exprs(getSema());
3852ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 4> Names;
3853a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
385460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult AsmString;
3855ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Clobbers(getSema());
3856703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3857703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  bool ExprsChanged = false;
3858c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3859703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the outputs.
3860703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
3861ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getOutputIdentifier(I));
3862c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3863703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3864703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain());
3865c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3866703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the output expr.
3867703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *OutputExpr = S->getOutputExpr(I);
386860d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getDerived().TransformExpr(OutputExpr);
3869703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3870703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3871c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3872703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != OutputExpr;
3873c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
38749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Exprs.push_back(Result.get());
3875703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3876c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3877703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the inputs.
3878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
3879ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getInputIdentifier(I));
3880c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3882703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain());
3883c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3884703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the input expr.
3885703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *InputExpr = S->getInputExpr(I);
388660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getDerived().TransformExpr(InputExpr);
3887703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3889c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3890703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != InputExpr;
3891c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
38929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Exprs.push_back(Result.get());
3893703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3894c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3895703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
3896703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    return SemaRef.Owned(S->Retain());
3897703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3898703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the clobbers.
3899703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
3900703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Clobbers.push_back(S->getClobber(I)->Retain());
3901703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3902703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // No need to transform the asm string literal.
3903703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  AsmString = SemaRef.Owned(S->getAsmString());
3904703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3905703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
3906703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isSimple(),
3907703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isVolatile(),
3908703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumOutputs(),
3909703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumInputs(),
3910a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson                                     Names.data(),
3911703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Constraints),
3912703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Exprs),
39139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     AsmString.get(),
3914703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Clobbers),
3915703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getRParenLoc(),
3916703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isMSAsm());
391743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
391843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
391943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
392043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
392160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
39221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
39234dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body of the @try.
392460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
39254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (TryBody.isInvalid())
39264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
3927c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39288f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  // Transform the @catch statements (if present).
39298f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool AnyCatchChanged = false;
3930ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> CatchStmts(SemaRef);
39318f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
393260d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
39334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Catch.isInvalid())
39344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
39358f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    if (Catch.get() != S->getCatchStmt(I))
39368f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      AnyCatchChanged = true;
39378f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    CatchStmts.push_back(Catch.release());
39384dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
3939c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39404dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the @finally statement (if present).
394160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Finally;
39424dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (S->getFinallyStmt()) {
39434dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    Finally = getDerived().TransformStmt(S->getFinallyStmt());
39444dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Finally.isInvalid())
39454dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
39464dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
39474dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
39484dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
39494dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
39504dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      TryBody.get() == S->getTryBody() &&
39518f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      !AnyCatchChanged &&
39524dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Finally.get() == S->getFinallyStmt())
39534dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
3954c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39554dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
39569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
39579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           move_arg(CatchStmts), Finally.get());
395843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
396043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
396160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
39621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
3963be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  // Transform the @catch parameter, if there is one.
3964be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *Var = 0;
3965be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (VarDecl *FromVar = S->getCatchParamDecl()) {
3966be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    TypeSourceInfo *TSInfo = 0;
3967be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (FromVar->getTypeSourceInfo()) {
3968be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
3969be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (!TSInfo)
3970be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor        return SemaRef.StmtError();
3971be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3972c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3973be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    QualType T;
3974be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (TSInfo)
3975be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = TSInfo->getType();
3976be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    else {
3977be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = getDerived().TransformType(FromVar->getType());
3978be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (T.isNull())
3979c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt        return SemaRef.StmtError();
3980be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3981c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3982be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
3983be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (!Var)
3984be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      return SemaRef.StmtError();
3985be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
3986c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
398760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
3988be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (Body.isInvalid())
3989be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return SemaRef.StmtError();
3990c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3991c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
3992be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             S->getRParenLoc(),
39939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Var, Body.get());
399443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
399643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
399760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
39981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
39994dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body.
400060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
40014dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (Body.isInvalid())
40024dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
4003c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40044dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
40054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
40064dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Body.get() == S->getFinallyBody())
40074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
40084dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
40094dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
40104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
40119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                               Body.get());
401243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
401443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
401560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
40161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
401760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Operand;
4018d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (S->getThrowExpr()) {
4019d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    Operand = getDerived().TransformExpr(S->getThrowExpr());
4020d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    if (Operand.isInvalid())
4021d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      return getSema().StmtError();
4022d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
4023c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4024d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4025d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      Operand.get() == S->getThrowExpr())
4026d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    return getSema().Owned(S->Retain());
4027c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
402943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
403143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
403260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
403343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
40341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
40358fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the object we are locking.
403660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
40378fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Object.isInvalid())
40388fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
4039c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40408fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the body.
404160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
40428fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Body.isInvalid())
40438fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
4044c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40458fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // If nothing change, just retain the current statement.
40468fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
40478fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Object.get() == S->getSynchExpr() &&
40488fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Body.get() == S->getSynchBody())
40498fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.Owned(S->Retain());
40508fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor
40518fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Build a new statement.
40528fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
40539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    Object.get(), Body.get());
405443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
405543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
405643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
405760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
405843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
40591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
4060c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the element statement.
406160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Element = getDerived().TransformStmt(S->getElement());
4062c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Element.isInvalid())
4063c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4064c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4065c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the collection expression.
406660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Collection = getDerived().TransformExpr(S->getCollection());
4067c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Collection.isInvalid())
4068c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4069c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4070c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the body.
407160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
4072c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Body.isInvalid())
4073c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4074c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4075c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // If nothing changed, just retain this statement.
4076c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
4077c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Element.get() == S->getElement() &&
4078c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Collection.get() == S->getCollection() &&
4079c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Body.get() == S->getBody())
4080c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.Owned(S->Retain());
4081c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4082c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Build a new statement.
4083c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
4084c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   /*FIXME:*/S->getForLoc(),
40859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Element.get(),
40869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Collection.get(),
4087c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   S->getRParenLoc(),
40889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Body.get());
408943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
409043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
409143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
409243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
409360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
409443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
409543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
409643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
409743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
409843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
409943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
410043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
410143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
410243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
410343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
410443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
41051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
410643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
410743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
4108a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                            ExceptionDecl->getTypeSourceInfo(),
410943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
411043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
411143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
411243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
4113ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor    if (!Var || Var->isInvalidDecl())
411443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
411543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
411743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
411860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
4119ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor  if (Handler.isInvalid())
412043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
41211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
412243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
412343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
412443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
412643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
412743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
412843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
41299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Handler.get());
413043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
413243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
413360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
413443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
413543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
413660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TryBlock
413743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
413843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
413943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
41401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
414143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
414243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
4143ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Handlers(SemaRef);
414443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
414560d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Handler
414643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
414743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
414843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
41491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
415043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
415143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
415243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
415443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
415543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
415643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
41571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
415843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
41599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
416143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
41621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
416343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
4165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
41661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
416760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4168454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
41691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
41701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
41711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
417360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4174454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
4175a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
4176a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
4177a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4178edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                       E->getQualifierRange());
4179a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
4180a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
4181a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4182dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4183dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
41847c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
41857c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getDecl()));
4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4189ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  DeclarationNameInfo NameInfo = E->getNameInfo();
4190ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  if (NameInfo.getName()) {
4191ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
4192ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    if (!NameInfo.getName())
4193ec8045d3f0375302eadaa63deb373bacaf25a569John McCall      return SemaRef.ExprError();
4194ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  }
41952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
41962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!getDerived().AlwaysRebuild() &&
4197a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
4198a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
41992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NameInfo.getName() == E->getDecl()->getDeclName() &&
4200096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
42011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4202dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
4203dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
4204dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
4205a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
4206dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return SemaRef.Owned(E->Retain());
4207a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4208dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4209dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
4210096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
4211dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
4212dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4213dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
4214dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4215dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TemplateArgumentLoc Loc;
4216dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4217dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall        return SemaRef.ExprError();
4218dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TransArgs.addArgument(Loc);
4219dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    }
4220dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
4221dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4222a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
42232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, TemplateArgs);
4224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
422760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4228454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4230577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
423360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4234454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
42351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
423960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4240454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
42411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
424560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4246454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
42471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
425160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4252454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
42531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
425760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4258454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
425960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
4268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
42701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
427160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4272454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
427360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
42781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
42829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get());
4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
428660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
42878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
42888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform the type.
42898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
42908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!Type)
42918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().ExprError();
4292c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform all of the components into components similar to what the
42948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // parser uses.
4295c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // FIXME: It would be slightly more efficient in the non-dependent case to
4296c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // just map FieldDecls, rather than requiring the rebuilder to look for
4297c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // the fields again. However, __builtin_offsetof is rare enough in
42988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // template code that we don't care.
42998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool ExprChanged = false;
43008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef Action::OffsetOfComponent Component;
43018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
43028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  llvm::SmallVector<Component, 4> Components;
43038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
43048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    const Node &ON = E->getComponent(I);
43058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Component Comp;
430672be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor    Comp.isBrackets = true;
43078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocStart = ON.getRange().getBegin();
43088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocEnd = ON.getRange().getEnd();
43098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
43108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array: {
43118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
431260d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Index = getDerived().TransformExpr(FromIndex);
43138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (Index.isInvalid())
43148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return getSema().ExprError();
4315c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      ExprChanged = ExprChanged || Index.get() != FromIndex;
43178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = true;
43189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Comp.U.E = Index.get();
43198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
43208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4321c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
43238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
43248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = false;
43258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.IdentInfo = ON.getFieldName();
432629d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor      if (!Comp.U.IdentInfo)
432729d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor        continue;
4328c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4330c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4331cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case Node::Base:
4332cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Will be recomputed during the rebuild.
4333cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
43348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4335c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Components.push_back(Comp);
43378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
4338c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // If nothing changed, retain the existing expression.
43408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
43418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Type == E->getTypeSourceInfo() &&
43428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      !ExprChanged)
43438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return SemaRef.Owned(E->Retain());
4344c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Build a new offsetof expression.
43468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
43478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          Components.data(), Components.size(),
43488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          E->getRParenLoc());
43498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
43508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
43518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived>
435260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4353454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
4355a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
43565557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
4357a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
43585ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43615ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
43631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43645ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
43651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
436960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr;
43701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
43751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildSizeOfAlignOf(SubExpr.get(), E->getOperatorLoc(),
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
439060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4391454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
439260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
439660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildArraySubscriptExpr(LHS.get(),
4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
44089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                RHS.get(),
4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
441360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4414454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
441660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
4422ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
442560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
44321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
44349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(Arg.get());
4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
44431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
44459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
445260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4453454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
445460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
445883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
445983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
44601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
446183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4462edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  E->getQualifierRange());
4463c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
446483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
446583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
44661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4467f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
44687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
44697c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getMemberDecl()));
4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44736bb8017bb9e828d118e15e59d71c66bba323c364John McCall  NamedDecl *FoundDecl = E->getFoundDecl();
44746bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (FoundDecl == E->getMemberDecl()) {
44756bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = Member;
44766bb8017bb9e828d118e15e59d71c66bba323c364John McCall  } else {
44776bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = cast_or_null<NamedDecl>(
44786bb8017bb9e828d118e15e59d71c66bba323c364John McCall                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
44796bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!FoundDecl)
44806bb8017bb9e828d118e15e59d71c66bba323c364John McCall      return SemaRef.ExprError();
44816bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
44826bb8017bb9e828d118e15e59d71c66bba323c364John McCall
4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
448583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
44868a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
44876bb8017bb9e828d118e15e59d71c66bba323c364John McCall      FoundDecl == E->getFoundDecl() &&
4488096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
4489c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
44901f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
44911f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
44921f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44941f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4496d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
4497096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
4498d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4499d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
45008a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4501d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
4502d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
45038a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
4504d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
45058a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
45068a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
4507c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
4511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4512c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
4513c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
4514c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
4515c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
4516c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
4517c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
45189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
4519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
452083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
452183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
45222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                        E->getMemberNameInfo(),
45238a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
45246bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                        FoundDecl,
4525096832c5ed5b9106fa177ebc148489760c3bc496John McCall                                        (E->hasExplicitTemplateArgs()
4526d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
4527c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
4528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
453160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4532454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
453360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
453760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
45441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
45479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            LHS.get(), RHS.get());
4548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
45501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
455160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
4553454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
4554454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
455860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4559454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
456060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(E->getCond());
4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
456460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
456860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
45771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildConditionalOperator(Cond.get(),
457947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
45809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 LHS.get(),
458147e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
45829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 RHS.get());
4583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
458660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4587454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
4588a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
4589a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
45906eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
4591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
459460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4595454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
45969d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
45979d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
46001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
4602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
46031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
46059d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
46069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
461060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
46116eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
46169d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
46181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46209d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
46219d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            NewT,
4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
46239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            SubExpr.get());
4624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
462760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4628454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
462942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
463042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
463142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
463242f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return SemaRef.ExprError();
46331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
463460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Init = getDerived().TransformExpr(E->getInitializer());
4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
463942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      OldT == NewT &&
4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
46411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
46431d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // Note: the expression type doesn't necessarily match the
46441d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // type-as-written, but that's okay, because it should always be
46451d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // derivable from the initializer.
46461d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
464742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
46499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Init.get());
4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
465360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4654454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
465560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
4656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
46611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
46641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
4665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
46669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
4668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
467260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4673454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
46751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4676ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> Inits(SemaRef);
4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
467860d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Init = getDerived().TransformExpr(E->getInit(I));
4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
46839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Inits.push_back(Init.get());
4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
46871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
4690e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
469460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4695454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
46971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
469843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
469960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Init = getDerived().TransformExpr(E->getInit());
4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
470343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
4704ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef);
4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
47151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
471760d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
47201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
47231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
47281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
473060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Start
4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
473560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
47431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
47461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
47589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                E->usesGNUSyntax(), Init.get());
4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
476260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
4764454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
47655557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4766c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
47675557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
47685557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
47751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
47761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
478160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4782454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
47839bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
47849bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo)
47859bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
47861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
478760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
47922cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara      TInfo == E->getWrittenTypeInfo() &&
4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
47972cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                       TInfo, E->getRParenLoc());
4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
480160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4802454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4804ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> Inits(SemaRef);
4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
480660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
48119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Inits.push_back(Init.get());
4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
482560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4826454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
483260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4833454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
483460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt
4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
48421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
48449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      SubStmt.get(),
4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
484960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4850454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
48513fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  TypeSourceInfo *TInfo1;
48523fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  TypeSourceInfo *TInfo2;
48539bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor
48549bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TInfo1 = getDerived().TransformType(E->getArgTInfo1());
48559bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo1)
48569bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
48571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48589bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TInfo2 = getDerived().TransformType(E->getArgTInfo2());
48599bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo2)
48609bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
4861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
48633fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara      TInfo1 == E->getArgTInfo1() &&
48643fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara      TInfo2 == E->getArgTInfo2())
48651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
48683fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                                 TInfo1, TInfo2,
48693fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                                 E->getRParenLoc());
4870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
487360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4874454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
487560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(E->getCond());
4876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
487960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
4880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
488360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
4884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
48911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
48949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Cond.get(), LHS.get(), RHS.get(),
4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
489960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4900454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
49011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
490560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4906454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4907668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
4908668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
4909668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
4910668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
4911668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
4912668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4913668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4914c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4915668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
4916668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
4917668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4918668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4919668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
492060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Object = getDerived().TransformExpr(E->getArg(0));
4921668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4922668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      return SemaRef.ExprError();
4923668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4924668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
4925668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
4926668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
4927668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
4928668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4929668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
4930ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> Args(SemaRef);
4931668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4932668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
49336eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      if (getDerived().DropCallArgument(E->getArg(I)))
49346eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor        break;
4935c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
493660d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4937668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4938668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        return SemaRef.ExprError();
4939668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4940668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      // FIXME: Poor source location information.
4941668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      SourceLocation FakeCommaLoc
4942668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        = SemaRef.PP.getLocForEndOfToken(
4943668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4944668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      FakeCommaLocs.push_back(FakeCommaLoc);
4945668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      Args.push_back(Arg.release());
4946668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    }
4947668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
49489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
4949668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
4950668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        FakeCommaLocs.data(),
4951668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
4952668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4953668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4954668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4955668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
4956668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4957668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
4958668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
4959668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
4960668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
4961668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4962668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
4963668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
4964668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4965668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4966668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4967668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4968668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4969668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4970668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4971668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
497260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
4973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
497660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult First = getDerived().TransformExpr(E->getArg(0));
4977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
498060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Second;
4981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
49861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
49901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
49911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
49921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
49959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Callee.get(),
49969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 First.get(),
49979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Second.get());
4998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
500160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5002454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
5003454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
500760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5008454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
50099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
50109d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
50131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
5014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
50161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
50189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
50199d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
502360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
50246eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
50299d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
50311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
50341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
5039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
5040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
50411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
5042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
50439d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                              NewT,
5044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
5045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
50469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              SubExpr.get(),
5047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
5048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
505160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5052454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
5053454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
505760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5058454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
5059454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
506360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
5065454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
5066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
507060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5071454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
5072454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
507660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
5078454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
50799d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
50809d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
50831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50849d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
50859d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
50869d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
509060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
50916eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
50969d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
50981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
51039d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                   NewT,
5104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
51059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr.get(),
5106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
511060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5111454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
5112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
511357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    TypeSourceInfo *TInfo
511457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor      = getDerived().TransformType(E->getTypeOperandSourceInfo());
511557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    if (!TInfo)
5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
511957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor        TInfo == E->getTypeOperandSourceInfo())
5120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
51211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
512257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getType(),
512357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             E->getLocStart(),
512457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             TInfo,
5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
5130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
51311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
5132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
51331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
513460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
5135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
51401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
514257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getType(),
514357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                           E->getLocStart(),
51449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get(),
5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
5146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
514960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5150454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
51511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
515560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
5157454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
516260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5163454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
51651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
51731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5174828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
5175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
517860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5179454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
518060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
51861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get());
5189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
519260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5193454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
51941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
51957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
51967c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
5197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
5198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
520053cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
5201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
5202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
52031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5204036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
5205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
520860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5209ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
5210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
52181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
52191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5220ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  return getDerived().RebuildCXXScalarValueInitExpr(E->getTypeBeginLoc(),
5221ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                 /*FIXME:*/E->getTypeBeginLoc(),
5222ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    T,
5223ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    E->getRParenLoc());
5224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
522760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5228454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
5229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
5230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
5232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
5233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
523660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
5237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
5238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
5241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5242ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> PlacementArgs(SemaRef);
5243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
524460d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
5245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
52471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
5249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
5250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
525243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
5253ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> ConstructorArgs(SemaRef);
5254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
5255ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor    if (getDerived().DropCallArgument(E->getConstructorArg(I)))
5256ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor      break;
5257ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor
525860d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
5259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
52611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
5263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
5264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
52671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
52681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
52691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
52707c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
52721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
52731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52741af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52751af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52761af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
52771af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
52781af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
52797c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
52807c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
52811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
52821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52831af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52841af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
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() &&
5295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
5296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
52971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
52981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
52991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
53001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
53011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53031af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
53041af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
53051af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
53061af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
53071af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53081af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53101af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
53135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
53145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
53155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
53165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
53175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
53185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
53195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
53205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
53215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
53225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
5323c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      ArraySize
53245b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
5325c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                  ConsArrayT->getSize(),
53265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  SemaRef.Context.getSizeType(),
53275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  /*FIXME:*/E->getLocStart()));
53285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
53295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
53305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
53315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
53325b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
53335b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
53345b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
53355b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
53365b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
5337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
5338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
5339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
5341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
53424bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                        E->getTypeIdParens(),
5343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
5344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
53469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        ArraySize.get(),
5347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
53491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
5350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
535360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5354454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
535560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Operand = getDerived().TransformExpr(E->getArgument());
5356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
5357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
53581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53591af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
53601af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
53611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
53621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
53637c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
53647c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
53651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
53661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
53671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5368c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
53701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
53711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
53721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53741af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53751af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53771af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
5380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
5381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
53829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Operand.get());
5383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
538660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5387a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
5388454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
538960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
5390a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
5391a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
53921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5393b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  ParsedType ObjectTypePtr;
5394a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
53959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
5396a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
5397a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
5398a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
5399a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
5400a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
5401a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    return SemaRef.ExprError();
5402c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5403b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  QualType ObjectType = ObjectTypePtr.get();
5404a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
5405a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5406b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor                                                E->getQualifierRange(),
5407a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                ObjectType);
5408a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
5409a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
54101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5411a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
5412a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
5413a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
5414a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
5415a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
5416a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5417a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
5418a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
5419a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
5420a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
5421a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
5422a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
5423a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
5424a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
5425a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    CXXScopeSpec SS;
5426a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (Qualifier) {
5427a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setScopeRep(Qualifier);
5428a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setRange(E->getQualifierRange());
5429a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    }
5430c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5431b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
5432a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
5433a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
5434a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
5435a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
5436a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
5437a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
5438a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5439c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5440a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
5441a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
5442a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
5443a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
544426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
544526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
544626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
5447c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
5448a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                               ObjectType);
544926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
5450a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
5451a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
5452c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
5454a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
5455a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
5456a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
545726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getQualifierRange(),
545826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
545926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
5460fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
5461a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
5462a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
54631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5464a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
546560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5466ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
5467454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
5468f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
5469f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5470f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
5471f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
5472f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5473f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
5474f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
5475f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
54767c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
54777c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
54787c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
54799f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
54809f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
54819f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
54829f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
54839f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
54849f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
54859f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
54869f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5487f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5488f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
5489f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
5490f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5491f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5492f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
5493f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
5494f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
5495f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
5496f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5497f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
5498f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5500f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
5501f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
5502f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
5503f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5504f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
5505f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
5506f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
5507f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
5508f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5509edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                    Old->getQualifierRange());
5510f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
5511f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5512c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5513f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
5514f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
5515c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  }
5516c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5517c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (Old->getNamingClass()) {
551866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    CXXRecordDecl *NamingClass
551966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
552066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                            Old->getNameLoc(),
552166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
552266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
552366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5524c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
552566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5526f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5527f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5528f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
5529f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
5530f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
5531f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5532f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
5533f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
5534f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
5535f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5536f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
5537f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
5538f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5539f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
5540f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5541f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5542f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
5543f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
5544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
554760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5548454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
55501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
55581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
5560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
55621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
5564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
5566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
5567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
557160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5572865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
55732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               DependentScopeDeclRefExpr *E) {
5574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
5575f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5576edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                E->getQualifierRange());
5577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
5578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
55812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
55822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
558381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
55841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5585f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
5586f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
5587f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
55882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // Note: it is sufficient to compare the Name component of NameInfo:
55892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // if name has not changed, DNLoc has not changed either.
55902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getDeclName())
5591f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
55921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5593f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5594f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
55952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                         NameInfo,
5596f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
5597f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
5598d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
5599d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5601d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5602d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5604d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
5605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5607f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5608f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
56092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
5610f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
5611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
561460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5615454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
5616321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
5617321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
5618321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
5619321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5620321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
5621321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
5622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
56307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
56317c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5636ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
56371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
5639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
56406eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
56416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
56426eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
56436eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
56446eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
564560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult TransArg = getDerived().TransformExpr(*Arg);
5646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
56481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
56509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(TransArg.get());
5651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
5656c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
56571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
56581af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
5659c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
5661c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
56621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56634411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
56644411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
56658c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              move_arg(Args),
56668c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              E->requiresZeroInitialization(),
56678c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              E->getConstructionKind());
5668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
5671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56725132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
56735132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
5674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
567560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5676454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
56775132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5680eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// \brief Transform a C++ reference-binding expression.
5681eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson///
5682eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// Since CXXBindReferenceExpr nodes are implicitly generated, we just
5683eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// transform the subexpression and return that.
5684eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssontemplate<typename Derived>
568560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5686eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonTreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
5687eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  return getDerived().TransformExpr(E->getSubExpr());
5688eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
5689eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
56901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
5691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
5692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56935132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
56945132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
5695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
569660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
56985132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
56995132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
570360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5705454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXTemporaryObjectExpr *E) {
5706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
5713c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                  getDerived().TransformDecl(E->getLocStart(),
57147c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5719ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
5720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
57211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
5723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
572491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
572591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      ArgumentChanged = true;
572691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      break;
572791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    }
572891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor
572960d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult TransArg = getDerived().TransformExpr(*Arg);
5730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
57321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
5735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
574091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
574191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
574291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
5743a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth    return SemaRef.MaybeBindToTemporary(E->Retain());
574491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
57451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
5747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
5748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
5749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
57501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
5751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
5752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
5754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
5755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
5756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
5757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
5758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
5759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
576260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5764454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
5765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
5767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5771ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
5772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
5773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
5775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
577660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult TransArg = getDerived().TransformExpr(*Arg);
5777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
57791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
5782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
57839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(TransArg.get());
5784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
5788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
57891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
57901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
5792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
5793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
5794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
5795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
5796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
5797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
5798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
580160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5802865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
58032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                             CXXDependentScopeMemberExpr *E) {
5804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
580560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base((Expr*) 0);
5806aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
5807aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5808aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
5809aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
5810aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
5811aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
5812aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5813aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
58141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5815aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
5816b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ParsedType ObjectTy;
5817d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
58189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
5819aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
5820a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
5821d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
5822d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
5823aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5824aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5825aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
5826b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ObjectType = ObjectTy.get();
5827aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5828aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5829aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
5830aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
5831aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5832aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
58331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58346cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
58356cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
5836c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
58376cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
58386cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
58396cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
58401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5841a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
5842a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
5843a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5844a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
5845aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
5846aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
5847a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
5848a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
5849a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
58501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
58522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo(),
58532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                ObjectType);
58542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
585581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
58561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5857aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
58583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
58593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
58603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
5861aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
5862aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
58633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
58642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getMember() &&
58653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
58661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
58671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
5869aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
58703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
58713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
58723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
58733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
5874129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
58752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
5876129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
58773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
5879d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
58803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5881d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5882d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
58833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
5884d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
58853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
5888aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
5889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
5890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
5891a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
5892a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
58933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
58942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                     NameInfo,
5895129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
5896129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
5897129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5898129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
589960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5900454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5901129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
590260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base((Expr*) 0);
5903aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5904aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
5905aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
5906aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5907aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5908aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5910aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5911aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5912129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5913129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5914129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5915129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5916129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5917edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  Old->getQualifierRange());
5918129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5919129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      return SemaRef.ExprError();
5920129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5921129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
59222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  LookupResult R(SemaRef, Old->getMemberNameInfo(),
5923129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5924129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5925129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5926129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5927129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
59287c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
59297c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
59307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
59319f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
59329f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
59339f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
59349f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
59359f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
59369f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
59379f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
59389f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5939129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5940129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5941129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5942129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5943129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5944129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5945129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5946129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5947129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5948129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5949129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5950129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5951129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5952129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5953129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5954c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  // Determine the naming class.
5955042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth  if (Old->getNamingClass()) {
5956c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    CXXRecordDecl *NamingClass
5957c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
595866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                          Old->getMemberLoc(),
595966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
596066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
596166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5962c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
596366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5964c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
5965c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5966129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5967129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5968129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5969129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5970129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5971129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5972129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5973129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5974129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        return SemaRef.ExprError();
5975129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5976129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5977129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5978c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
5979c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5980c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5981c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5982c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5983c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5984c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
59859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
5986aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
5987129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
5988129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
5989129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
5990129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
5991c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
5992129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
5993129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
5994129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
5995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
599860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5999454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
60001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
600460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6005454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
600681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *EncodedTypeInfo
600781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
600881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!EncodedTypeInfo)
6009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
60101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
601281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
60131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
6014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
601681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                            EncodedTypeInfo,
6017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
6018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
602160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6022454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
602392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Transform arguments.
602492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  bool ArgChanged = false;
6025ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
602692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
602760d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Arg = getDerived().TransformExpr(E->getArg(I));
602892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Arg.isInvalid())
602992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
6030c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
603192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
60329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(Arg.get());
603392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
603492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
603592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
603692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Class message: transform the receiver type.
603792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    TypeSourceInfo *ReceiverTypeInfo
603892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      = getDerived().TransformType(E->getClassReceiverTypeInfo());
603992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!ReceiverTypeInfo)
604092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
6041c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
604292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If nothing changed, just retain the existing message send.
604392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
604492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
604592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.Owned(E->Retain());
604692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
604792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Build a new class message send.
604892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
604992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getSelector(),
605092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getMethodDecl(),
605192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getLeftLoc(),
605292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               move_arg(Args),
605392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getRightLoc());
605492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
605592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
605692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Instance message: transform the receiver
605792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
605892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor         "Only class and instance messages may be instantiated");
605960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Receiver
606092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    = getDerived().TransformExpr(E->getInstanceReceiver());
606192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (Receiver.isInvalid())
606292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.ExprError();
606392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
606492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // If nothing changed, just retain the existing message send.
606592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
606692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
606792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.Owned(E->Retain());
6068c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
606992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Build a new instance message send.
60709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCMessageExpr(Receiver.get(),
607192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getSelector(),
607292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getMethodDecl(),
607392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getLeftLoc(),
607492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             move_arg(Args),
607592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getRightLoc());
6076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
607960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6080454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
60811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
608560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6086454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
6087ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return SemaRef.Owned(E->Retain());
6088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
609160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6092454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
6093f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
609460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6095f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6096f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6097f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor
6098f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // We don't need to transform the ivar; it will never change.
6099c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6100f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6101f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6102f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6103f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6104c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
6106f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->getLocation(),
6107f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->isArrow(), E->isFreeIvar());
6108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
611160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6112454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
6113e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // Transform the base expression.
611460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6115e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (Base.isInvalid())
6116e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.ExprError();
6117c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6118e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // We don't need to transform the property; it will never change.
6119c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6120e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // If nothing changed, just retain the existing expression.
6121e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6122e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      Base.get() == E->getBase())
6123e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.Owned(E->Retain());
6124c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCPropertyRefExpr(Base.get(), E->getProperty(),
6126e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                 E->getLocation());
6127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
613060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
613109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
6132454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
61339cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If this implicit setter/getter refers to class methods, it cannot have any
61349cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // dependent parts. Just retain the existing declaration.
61359cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (E->getInterfaceDecl())
61369cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6137c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61389cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // Transform the base expression.
613960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
61409cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (Base.isInvalid())
61419cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.ExprError();
6142c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61439cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // We don't need to transform the getters/setters; they will never change.
6144c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61459cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If nothing changed, just retain the existing expression.
61469cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
61479cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor      Base.get() == E->getBase())
61489cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6149c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61509cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
61519cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getGetterMethod(),
61529cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getType(),
61539cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getSetterMethod(),
61549cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getLocation(),
61559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                             Base.get());
6156c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
616060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6161454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
6162ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // Can never occur in a dependent context.
61631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
616760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6168454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
6169f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
617060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6171f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6172f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6173c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6174f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6175f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6176f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6177f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6178c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
6180f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                         E->isArrow());
6181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
618460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6185454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
6186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6187ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> SubExprs(SemaRef);
6188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
618960d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
6190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
6191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
61921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
61949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    SubExprs.push_back(SubExpr.get());
6195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
61961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
61991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
62001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
6202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
6203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
6204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
620760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6208454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
6209a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  SourceLocation CaretLoc(E->getExprLoc());
6210a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6211a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  SemaRef.ActOnBlockStart(CaretLoc, /*Scope=*/0);
6212a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  BlockScopeInfo *CurBlock = SemaRef.getCurBlock();
6213a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  CurBlock->TheDecl->setIsVariadic(E->getBlockDecl()->isVariadic());
6214a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  llvm::SmallVector<ParmVarDecl*, 4> Params;
6215a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  llvm::SmallVector<QualType, 4> ParamTypes;
6216a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6217a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Parameter substitution.
6218a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  const BlockDecl *BD = E->getBlockDecl();
6219a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  for (BlockDecl::param_const_iterator P = BD->param_begin(),
6220a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian       EN = BD->param_end(); P != EN; ++P) {
6221a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParmVarDecl *OldParm = (*P);
6222a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParmVarDecl *NewParm = getDerived().TransformFunctionTypeParam(OldParm);
6223a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    QualType NewType = NewParm->getType();
6224a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    Params.push_back(NewParm);
6225a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParamTypes.push_back(NewParm->getType());
6226a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6227a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6228a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  const FunctionType *BExprFunctionType = E->getFunctionType();
6229a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  QualType BExprResultType = BExprFunctionType->getResultType();
6230a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!BExprResultType.isNull()) {
6231a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    if (!BExprResultType->isDependentType())
6232a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      CurBlock->ReturnType = BExprResultType;
6233a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    else if (BExprResultType != SemaRef.Context.DependentTy)
6234a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      CurBlock->ReturnType = getDerived().TransformType(BExprResultType);
6235a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6236a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6237a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Transform the body
623860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(E->getBody());
6239a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (Body.isInvalid())
6240a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.ExprError();
6241a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Set the parameters on the block decl.
6242a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!Params.empty())
6243a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    CurBlock->TheDecl->setParams(Params.data(), Params.size());
6244a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6245a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  QualType FunctionType = getDerived().RebuildFunctionProtoType(
6246a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        CurBlock->ReturnType,
6247a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        ParamTypes.data(),
6248a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        ParamTypes.size(),
6249a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        BD->isVariadic(),
6250fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                        0,
6251fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                               BExprFunctionType->getExtInfo());
6252a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6253a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  CurBlock->FunctionType = FunctionType;
62549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.ActOnBlockStmtExpr(CaretLoc, Body.get(), /*Scope=*/0);
6255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
625860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6259454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
6260a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  NestedNameSpecifier *Qualifier = 0;
6261a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6262a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  ValueDecl *ND
6263a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
6264a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                       E->getDecl()));
6265a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!ND)
6266a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.ExprError();
62672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
6268a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!getDerived().AlwaysRebuild() &&
6269a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      ND == E->getDecl()) {
6270a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // Mark it referenced in the new context regardless.
6271a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // FIXME: this is a bit instantiation-specific.
6272a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
6273a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6274a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.Owned(E->Retain());
6275a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6276a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
62772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation());
6278a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  return getDerived().RebuildDeclRefExpr(Qualifier, SourceLocation(),
62792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, 0);
6280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
6284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
628785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
628885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
62892865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildPointerType(PointeeType, Star,
6290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
6291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
629485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
629585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
62962865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Star,
6297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
6298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
63011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
630285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
630385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
630485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
63052865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
630685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
6307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
63101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
631185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
631285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
631385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
63142865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
631585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
6316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
6320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
6321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
6322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
6323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
6324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
6325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
6326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
6327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
6328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
6329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
63301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
63321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
63331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
63341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
6335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
6336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
6337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
6338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
6339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
6340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
6341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
6342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
63431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
63451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
6346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
63471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
6348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
6353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
6354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
635585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
635685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
63571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
635885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
6359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
6364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
636585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
636685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
63671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
636885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
6369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
6374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
63759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SizeExpr,
6376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
6377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
63781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
63799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
6380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
6386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
63879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Expr *SizeExpr,
6388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
6389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
63901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
63919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
6392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
6397788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                     unsigned NumElements,
6398788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                     VectorType::AltiVecSpecific AltiVecSpec) {
6399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
6400788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  return SemaRef.Context.getVectorType(ElementType, NumElements, AltiVecSpec);
6401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
6405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
6406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
6407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
6408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
6409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
64101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
6411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
64129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
6413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
64161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
64171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
64189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                           Expr *SizeExpr,
6419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
64209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
6421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
64251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
6426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
64271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
6428fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                          unsigned Quals,
6429fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                            const FunctionType::ExtInfo &Info) {
64301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
6431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
6432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
6433fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   getDerived().getBaseEntity(),
6434fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   Info);
6435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
6439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
6440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
6441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
6442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
6443ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
6444ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
6445ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
6446ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
644792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // FIXME: Doesn't account for ObjCInterfaceDecl!
6448ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
6449ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
6450ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
6451ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
6452ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
6453ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6454ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
6455ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
6456ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
6457c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6458ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
6459ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
6460ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
6461ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
6462ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
6463ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6464ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
6465ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
6466ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6467ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
64689ae2f076ca5ab1feb3ba95629099ec2319833701John McCallQualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E) {
64699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildTypeofExprType(E);
6470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
6474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
6475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
64789ae2f076ca5ab1feb3ba95629099ec2319833701John McCallQualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E) {
64799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildDecltypeType(E);
6480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
6484833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
6485833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
6486d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
6487d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
6488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6490dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6491dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6492dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6493dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6494a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
6495c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
6496d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
6497dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
6498dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
6499dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
6500dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
6501dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
65021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
6503495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
6504c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
6505c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
650646646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
6507dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6508dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6509dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6511dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6512dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6513dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
6514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
6515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6516dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6517dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6518dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6519dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6520dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6521dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
6522edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   QualType T) {
6523edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor  if (T->isDependentType() || T->isRecordType() ||
6524dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
6525a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6526dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
6527dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
6528dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
65291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6530dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
6531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
6532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
65331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6534d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
65351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6536d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6537d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
6538d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
65391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
6540d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
6541d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
6542d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
6543d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
65441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6545d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
65463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
65473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
6548d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
6549d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
65501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
6551014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
6552014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
6553d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
6554d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6555d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6556d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
6557d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
6558b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                       ParsedType::make(ObjectType),
6559d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
6560d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
6561d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
6562d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
65631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6565ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
6566ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6567ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
6568ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
6569ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
6570ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6571ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
6572ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
6573ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
6574ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
6575ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
6576d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
6577d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6578ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6579d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
6580d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
6581b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                       ParsedType::make(ObjectType),
6582d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
6583d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
6584d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
6585ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
6586c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6587ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
658860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
6590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
65919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *OrigCallee,
65929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *First,
65939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *Second) {
65949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Callee = OrigCallee->IgnoreParenCasts();
65959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
65961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
6598f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
65999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
66009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType())
66019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinArraySubscriptExpr(First,
66029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Callee->getLocStart(),
66039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Second, OpLoc);
66041a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
66051a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
66069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc);
66079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  } else if (Second == 0 || isPostIncDec) {
66089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType()) {
6609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
6610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
66111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
6612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
66131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
6615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
66179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
66189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType()) {
6619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
6620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
6621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
662260d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Result
66239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
6624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
6625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
66261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
6628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
6632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
66336e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
66341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
6636ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
6637ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
6638ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
6639ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
66406e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
6641ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
66429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl());
6643ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
66441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
66469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Args[2] = { First, Second };
66479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  unsigned NumArgs = 1 + (Second != 0);
66481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
6650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
66511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
6652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
66539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
6654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6656f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
66579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(),
6658ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
66599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      First,
66609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Second);
6661f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
6662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
66631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
6664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
666560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Result
6666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
6667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
6668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
66691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
6671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
667326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
667460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
66759ae2f076ca5ab1feb3ba95629099ec2319833701John McCallTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
667626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
667726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
667826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                 NestedNameSpecifier *Qualifier,
667926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceRange QualifierRange,
668026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
668126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
6682fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
6683a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
668426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  CXXScopeSpec SS;
668526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (Qualifier) {
668626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setRange(QualifierRange);
668726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setScopeRep(Qualifier);
668826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
668926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
66909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType BaseType = Base->getType();
66919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
669226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
6693c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      (isArrow && BaseType->getAs<PointerType>() &&
6694bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
6695bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
669626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
66979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
669826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
6699fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
6700a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
670126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
670226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
67032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
6704a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
67052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
67062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                 SemaRef.Context.getCanonicalType(DestroyedType->getType())));
67072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
67082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  NameInfo.setNamedTypeInfo(DestroyedType);
67092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
671026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
67112577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
67129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getSema().BuildMemberReferenceExpr(Base, BaseType,
671326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
671426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
67152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            NameInfo,
671626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
671726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
671826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
6719577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
6720577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
6722