TreeTransform.h revision d226f65006733ed7f709c3174f22ce33391cb58f
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"
20657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
22b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
26a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h"
2719510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Ownership.h"
2819510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h"
29b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
30a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h"
31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
64670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
7143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningStmtResult OwningStmtResult;
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningExprResult OwningExprResult;
94b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::StmtArg StmtArg;
95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::ExprArg ExprArg;
96b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
9743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  typedef Sema::MultiStmtArg MultiStmtArg;
98c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
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.
222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult 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.
232454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult 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
33943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
340d8383d45e41ba2316610e5d638d2872e37b67cfbZhongxing Xu  OwningExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
34343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
345454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult Transform##Node(Node *E);
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,
423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg 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,
434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg 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,
460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg 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.
499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg 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.
510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg 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.
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(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.
72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
7281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(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.
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(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.
7451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
7481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(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.
7561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(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.
767eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
768c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                 VarDecl *CondVar, StmtArg Then,
76999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 SourceLocation ElseLoc, StmtArg Else) {
770d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall    return getSema().ActOnIfStmt(IfLoc, Cond, CondVar,
77199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 move(Then), ElseLoc, move(Else));
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
778586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
779586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          Sema::ExprArg Cond,
78099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                          VarDecl *CondVar) {
781586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, move(Cond),
782d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                            CondVar);
78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
79943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
800eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                    Sema::FullExprArg Cond,
80199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
803eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond,
804d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                    CondVar, move(Body));
80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
81143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
81243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
81343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
81443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
81543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
8161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
81743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
81843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
81943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
82043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
82143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
82243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
82343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
82543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
826eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                  StmtArg Init, Sema::FullExprArg Cond,
82799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
82843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
829eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond,
830d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                  CondVar,
83199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  Inc, RParenLoc, move(Body));
83243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
83643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
83743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
83943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
84043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
84143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
84243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
84343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
84443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
84543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
84643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
84743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
84843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
84943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
85043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
85143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
85243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
85543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
85643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
85743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
85843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
85943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
86243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
86543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
86643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
86743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
86843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
8691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
87043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
87143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
87243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
87343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
87443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
87543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
87643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
879703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
880703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
882703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc,
883703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
884703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
885703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
886703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
887ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
889703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
890703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  ExprArg AsmString,
891703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
892703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
893703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
894c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
895703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
896703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  move(Exprs), move(AsmString), move(Clobbers),
897703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
898703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
8994dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
9004dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @try statement.
9014dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
9024dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9034dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9044dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
9054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        StmtArg TryBody,
9068f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                        MultiStmtArg CatchStmts,
9074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        StmtArg Finally) {
9088f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(CatchStmts),
9094dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        move(Finally));
9104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
9114dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
912be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Rebuild an Objective-C exception declaration.
913be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
914be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new declaration.
915be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
916be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
917be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                    TypeSourceInfo *TInfo, QualType T) {
918c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildObjCExceptionDecl(TInfo, T,
919c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                            ExceptionDecl->getIdentifier(),
920be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                            ExceptionDecl->getLocation());
921be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
922c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
923be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Build a new Objective-C @catch statement.
924be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
925be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
926be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
927be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  OwningStmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
928be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          SourceLocation RParenLoc,
929be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          VarDecl *Var,
930be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          StmtArg Body) {
931be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
932d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                          Var, move(Body));
933be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
934c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9354dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @finally statement.
9364dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
9374dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9384dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9394dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
9404dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                            StmtArg Body) {
9414dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return getSema().ActOnObjCAtFinallyStmt(AtLoc, move(Body));
9424dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
943c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9448fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @throw statement.
945d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  ///
946d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
947d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
948d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  OwningStmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
949d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor                                          ExprArg Operand) {
950d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    return getSema().BuildObjCAtThrowStmt(AtLoc, move(Operand));
951d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
952c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9538fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @synchronized statement.
9548fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  ///
9558fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
9568fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9578fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningStmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
9588fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 ExprArg Object,
9598fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 StmtArg Body) {
9608fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, move(Object),
9618fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 move(Body));
9628fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  }
963c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor
964c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// \brief Build a new Objective-C fast enumeration statement.
965c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  ///
966c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
967c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
968c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
969c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation LParenLoc,
970c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                StmtArg Element,
971c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                ExprArg Collection,
972c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation RParenLoc,
973c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                StmtArg Body) {
974c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
975c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                move(Element),
976c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                move(Collection),
977c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                RParenLoc,
978c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                move(Body));
979c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  }
980c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
98143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
98243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
98343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
98443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
986a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
98743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
98843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
98943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
99143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
99243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
99343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
99443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
99543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
99643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
99743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
99843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
99943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
100043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
100143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
100343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
100443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
100843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
100943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
101043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
101143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
101243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
101343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
101443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1020f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1021f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              LookupResult &R,
1022f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              bool RequiresADL) {
1023f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1024f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
1025f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1026f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1027f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
1028f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
1029f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
1030f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
1031a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
1032a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
10332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                      ValueDecl *VD,
10342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                      const DeclarationNameInfo &NameInfo,
1035dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      TemplateArgumentListInfo *TemplateArgs) {
1036a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
1037a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
1038a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
1039dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
1040dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
10412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
10422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
10461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1054a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
10551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1056a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1057a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1058a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
1059a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
1060a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
1061a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                NestedNameSpecifier *Qualifier,
106226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceRange QualifierRange,
106326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  TypeSourceInfo *ScopeType,
106426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceLocation CCLoc,
1065fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                  SourceLocation TildeLoc,
1066a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
10671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
10691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
10756ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr));
1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Build a new builtin offsetof expression.
10798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ///
10808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
10818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OwningExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
10838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       TypeSourceInfo *Type,
10848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       Action::OffsetOfComponent *Components,
10858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       unsigned NumComponents,
10868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       SourceLocation RParenLoc) {
10878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
10888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          NumComponents, RParenLoc);
10898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1090c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1095a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
10965ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
1098a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
11011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
11031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
11081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
11271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
11321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
11481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
114983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
115083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
11512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                     const DeclarationNameInfo &MemberNameInfo,
1152f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                                     ValueDecl *Member,
11536bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                     NamedDecl *FoundDecl,
1154d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
11558a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
1156d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
1157d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
1158d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
11591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116083a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor      Expr *BaseExpr = Base.takeAs<Expr>();
11616bb8017bb9e828d118e15e59d71c66bba323c364John McCall      if (getSema().PerformObjectMemberConversion(BaseExpr, Qualifier,
11626bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                                  FoundDecl, Member))
116383a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        return getSema().ExprError();
11648aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
11651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
116683a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        new (getSema().Context) MemberExpr(BaseExpr, isArrow,
11672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                           Member, MemberNameInfo,
1168d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
1169d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
1170d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
11711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
117283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
117383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
117483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
117583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
117683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
117783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
117883c9abcce26422420dcdb9d2741bced21ee2477fDouglas Gregor    Expr *BaseExpr = Base.takeAs<Expr>();
117983c9abcce26422420dcdb9d2741bced21ee2477fDouglas Gregor    getSema().DefaultFunctionArrayConversion(BaseExpr);
118083c9abcce26422420dcdb9d2741bced21ee2477fDouglas Gregor    QualType BaseType = BaseExpr->getType();
1181aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
11826bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // FIXME: this involves duplicating earlier analysis in a lot of
11836bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // cases; we should avoid this when possible.
11842577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
11856bb8017bb9e828d118e15e59d71c66bba323c364John McCall    R.addDecl(FoundDecl);
1186c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1187c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
118883c9abcce26422420dcdb9d2741bced21ee2477fDouglas Gregor    return getSema().BuildMemberReferenceExpr(getSema().Owned(BaseExpr),
118983c9abcce26422420dcdb9d2741bced21ee2477fDouglas Gregor                                              BaseType, OpLoc, isArrow,
1190129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1191c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary 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.
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
1201c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc,
12026ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor                                LHS.takeAs<Expr>(), RHS.takeAs<Expr>());
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
12061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
12191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12229d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
12239d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
1226b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1227b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall                                         move(SubExpr));
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
12311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
123542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
123842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
123942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              move(Init));
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
12431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1250aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1251129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
1252aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
12532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
1254aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1255129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1256129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
12572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                              NameInfo,
1258129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
12621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1267e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1268e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
1269e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    OwningExprResult Result
1270e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1271e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1272e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1273c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1274e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1275e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1276e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1277e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1278e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
12821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
13011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
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.
13132cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
13142cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    ExprArg SubExpr, TypeSourceInfo *TInfo,
13152cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    SourceLocation RParenLoc) {
13162cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara    return getSema().BuildVAArgExpr(BuiltinLoc,
13172cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    move(SubExpr), TInfo,
13182cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    RParenLoc);
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1328c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1329f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
13331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
13341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
13583fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TypeSourceInfo *TInfo1,
13593fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TypeSourceInfo *TInfo2,
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
13613fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara    return getSema().BuildTypesCompatibleExpr(BuiltinLoc,
13623fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TInfo1, TInfo2,
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
13831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
13911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
14019d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
14089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
14091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
14139d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
14141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
14161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
14189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
14191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
14201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
14221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
14249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
14251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
14321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
14429d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1447c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
1448c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1449c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1450c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
14599d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1464c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1465c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1466c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1467c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
14769d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1481c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1482c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1483c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1484c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
14939d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1498c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
1499c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1500c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1501c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
15099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                TypeSourceInfo *TInfo,
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
151388650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
15159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                               TInfo->getType().getAsOpaquePtr(),
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
151788650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
15181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
152657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
152757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
152857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        TypeSourceInfo *Operand,
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1530c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
153157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
153857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
153957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
154257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, move(Operand),
154357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
15441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
15451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
15491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
15511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1552828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1553828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1555828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1556828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1572c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1573036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1574036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1575036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1582ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  OwningExprResult RebuildCXXScalarValueInitExpr(SourceLocation TypeStartLoc,
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
15861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
15881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
16014bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                     SourceRange TypeIdParens,
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
16091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
16134bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                 TypeIdParens,
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
16441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
16481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1653865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
16552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                       const DeclarationNameInfo &NameInfo,
1656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
16622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo,
1663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
16652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo);
1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1672f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1673f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1674f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1675d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1676f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
16844411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
16884411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
1689c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
16904411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
16914411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor      return getSema().ExprError();
1692c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
16934411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
16944411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           move_arg(ConvertedArgs));
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1738865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
1739aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1742a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1743a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1744129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
17452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                   const DeclarationNameInfo &MemberNameInfo,
1746129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1748a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1749a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
17501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1751aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1752aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1753129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
17542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            MemberNameInfo,
17552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            TemplateArgs);
1756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1758129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
17593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
17603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
17613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1762129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE,
1763aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1764129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1765129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1766129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1767129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1768c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1769129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1770129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
17713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
17723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
17733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
17741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1775aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1776aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1777c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1778c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
17793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
17801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
178681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                         TypeSourceInfo *EncodeTypeInfo,
1787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
178881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
1789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
17901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
179292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C class message.
179392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
179492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
179592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1796c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
179792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
179892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
179992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
180092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     ReceiverTypeInfo->getType(),
180192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     /*SuperLoc=*/SourceLocation(),
1802f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                     Sel, Method, LBracLoc, RBracLoc,
180392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     move(Args));
180492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
180592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
180692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C instance message.
180792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult RebuildObjCMessageExpr(ExprArg Receiver,
180892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
180992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1810c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
181192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
181292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
181392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    QualType ReceiverType = static_cast<Expr *>(Receiver.get())->getType();
181492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildInstanceMessage(move(Receiver),
181592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        ReceiverType,
181692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        /*SuperLoc=*/SourceLocation(),
1817f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                        Sel, Method, LBracLoc, RBracLoc,
181892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        move(Args));
181992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
182092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
1821f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C ivar reference expression.
1822f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1823f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1824f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1825f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult RebuildObjCIvarRefExpr(ExprArg BaseArg, ObjCIvarDecl *Ivar,
1826f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          SourceLocation IvarLoc,
1827f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          bool IsArrow, bool IsFreeIvar) {
1828f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    // FIXME: We lose track of the IsFreeIvar bit.
1829f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
1830f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1831f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
1832f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
1833f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1834f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IvarLoc,
1835d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0,
1836ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
1837f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1838f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1839c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1840f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1841f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1842c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1843c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1844f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              Base->getType(),
1845c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IvarLoc, IsArrow, SS,
1846f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1847c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1848f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1849f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1850e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor
1851e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// \brief Build a new Objective-C property reference expression.
1852e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  ///
1853e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1854e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1855c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  OwningExprResult RebuildObjCPropertyRefExpr(ExprArg BaseArg,
1856e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              ObjCPropertyDecl *Property,
1857e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              SourceLocation PropertyLoc) {
1858e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    CXXScopeSpec SS;
1859e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1860e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
1861e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                   Sema::LookupMemberName);
1862e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    bool IsArrow = false;
1863e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1864e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         /*FIME:*/PropertyLoc,
1865d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
1866e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.isInvalid())
1867e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return getSema().ExprError();
1868c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1869e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.get())
1870e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return move(Result);
1871c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1872c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1873e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              Base->getType(),
1874c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/PropertyLoc, IsArrow,
1875c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              SS,
1876e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*FirstQualifierInScope=*/0,
1877c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1878e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*TemplateArgs=*/0);
1879e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  }
1880c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1881c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// \brief Build a new Objective-C implicit setter/getter reference
18829cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// expression.
18839cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  ///
18849cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1885c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// Subclasses may override this routine to provide different behavior.
18869cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  OwningExprResult RebuildObjCImplicitSetterGetterRefExpr(
18879cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Getter,
18889cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          QualType T,
18899cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Setter,
18909cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        SourceLocation NameLoc,
18919cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          ExprArg Base) {
18929cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // Since these expressions can only be value-dependent, we do not need to
18939cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // perform semantic analysis again.
18949cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return getSema().Owned(
18959cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
18969cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     Setter,
18979cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     NameLoc,
18989cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          Base.takeAs<Expr>()));
18999cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  }
19009cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor
1901f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C "isa" expression.
1902f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1903f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1904f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1905f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult RebuildObjCIsaExpr(ExprArg BaseArg, SourceLocation IsaLoc,
1906f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                      bool IsArrow) {
1907f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
1908f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1909f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
1910f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
1911f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1912f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IsaLoc,
1913d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
1914f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1915f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1916c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1917f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1918f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1919c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1920c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1921f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              Base->getType(),
1922c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IsaLoc, IsArrow, SS,
1923f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1924c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1925f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1926f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1927c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
19361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
19411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
19460da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
19481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
19545291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor                                                   Builtin->getCallResultType(),
1955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
19571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
19621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
19641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
196843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
196943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
197043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
197143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
19721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
197343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
197443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
19751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
197643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
197743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
197843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
197943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
19804bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
198243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
198343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
19847381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
198543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
19864bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
198743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
198843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
198943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
199043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
19911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19925ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E));
199343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
19941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
19951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
199743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
19981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2000670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
2001454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
2003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
2004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
2006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
2007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
20087381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
2009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
2010454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
20114bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
20121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
20131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2015657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
2016657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
2017657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
2018dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
2019dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
2020a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
2021c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
2022c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
20230979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
20240979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
20251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
202643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
2027dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
2028dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
20291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
2030c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
2031c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
2032dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
2033dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
20341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
2036c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
2037a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
2038c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
2039dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2041dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
2042dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
20431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
2044a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
2045a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
2046a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
2047dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2050a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
2051c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
2052c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
20531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2054dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
2056dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
20577c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
20587c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       NNS->getAsNamespace()));
20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
2060dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2061dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
2062dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2064dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2065dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2067dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
2068dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
2069dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
2070dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
20711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2072dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
2073dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
2074fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2075124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
2076124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
2077d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
2078d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
20791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2080dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
2081dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2082dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
2083dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
20861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2087edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   T);
2088dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
2089dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2091dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
20921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
2093dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
2094dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
2095dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
20962577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameInfo
20972577743c5650c646fb705df01403707e94f2df04Abramo BagnaraTreeTransform<Derived>
20982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
20992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               QualType ObjectType) {
21002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name = NameInfo.getName();
210181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
21022577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return DeclarationNameInfo();
210381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
210481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
210581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
210681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
210781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
210881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
210981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
21103e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
211181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
21122577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NameInfo;
21131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
211481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
211581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
211681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
21172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    TypeSourceInfo *NewTInfo;
21182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CanQualType NewCanTy;
21192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
21202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       NewTInfo = getDerived().TransformType(OldTInfo, ObjectType);
21212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       if (!NewTInfo)
21222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara         return DeclarationNameInfo();
21232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
21242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
21252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    else {
21262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewTInfo = 0;
21272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
21282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      QualType NewT = getDerived().TransformType(Name.getCXXNameType(),
21292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                 ObjectType);
21302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      if (NewT.isNull())
21312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        return DeclarationNameInfo();
21322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewCanTy = SemaRef.Context.getCanonicalType(NewT);
21332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
21341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName NewName
21362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
21372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                           NewCanTy);
21382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NewNameInfo(NameInfo);
21392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setName(NewName);
21402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setNamedTypeInfo(NewTInfo);
21412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NewNameInfo;
214281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
21431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
21441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(0 && "Unknown name kind.");
21462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return DeclarationNameInfo();
214781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
214881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
214981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
21501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
21513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
21523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
21537c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  SourceLocation Loc = getDerived().getBaseLocation();
21547c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor
2155d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
21561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2157d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
2158124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2159124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
2160d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
2161d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2163d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
21657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2166d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
2167d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
21681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2169d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
2170d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
2171d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
2172d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
21731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2174d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
2175d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
2176d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2178f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
2179f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
2180d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2182d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
21831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2184d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
2185124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2186124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
21873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
2188d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2190d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2191dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
2192dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
2193d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2195ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
2196c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
2197ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
2198c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2199c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
2200ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
2201d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
22021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2203d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
22041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
22057c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2206d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
2207d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
22081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2209d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2210d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
2211d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
22121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2213d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
2214d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
22151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2216f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
2217f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
2218f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
2219d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
2220d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
2221d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
2222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
2223833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
2224833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2225833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
2226670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
2227670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
22289f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
2229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
2232833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
2233a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2234c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2235833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2237788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
2238788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
2239788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
2240c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
2242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2243833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2244833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2245833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
2246670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
2247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
2248828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2249833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2250833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2251833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2252833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2253833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2254833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
2255833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
2256833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2257833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
2258833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
2259833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
2260833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
2261833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
2262833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
22631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2264670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
2265a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2266833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
2267a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2268833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2269833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
2270833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
2271833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2272833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2273833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2274670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2276670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
2277833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
2278972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
2279972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2280972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
2281788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
22827c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2283833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
2284833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2285828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
2286828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
2287828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
2288828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
2289828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
2290828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (E.isInvalid())
2291828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = NULL;
2292828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      else {
2293828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = E.takeAs<Expr>();
2294828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr->Retain();
2295828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      }
2296828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
2297828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2298828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2300670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2302788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
2303c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
2304788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
2305788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
2306788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
2307788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
2308c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2309788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
2310788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
2311788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
2312788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
2313788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
2314c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2315670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
2316670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
23171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
2318670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
23191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
2321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2322833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2323833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
2324833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2325833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
2326833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2327833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *ETaken = E.takeAs<Expr>();
2328828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    ETaken->Retain();
2329833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2330833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2331670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2333670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2334670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2335670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
23361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2337670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2338670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
23391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2340833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2341833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2342833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2343828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2344828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2345828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2346828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2347833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2348833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2349828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2350670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2351670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
23521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2353670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2354828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2355833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2356670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2357670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2359670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2360833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2361670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2362670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2368c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntQualType TreeTransform<Derived>::TransformType(QualType T,
2369124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
23721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2375a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
23764802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2377c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2378124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
23791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
23821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2387124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2388124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
23911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
23931bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2397124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2401a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2406124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2407124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2412124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2413124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24179f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2422a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2423a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2424a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2425a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
24261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2429124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualifiedTypeLoc T,
2430124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2431a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2433124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2434124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
24431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24442865474261a608c7873b87ba4af110d17907896dJohn McCall  if (!Quals.empty()) {
24452865474261a608c7873b87ba4af110d17907896dJohn McCall    Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
24462865474261a608c7873b87ba4af110d17907896dJohn McCall    TLB.push<QualifiedTypeLoc>(Result);
24472865474261a608c7873b87ba4af110d17907896dJohn McCall    // No location information to preserve.
24482865474261a608c7873b87ba4af110d17907896dJohn McCall  }
2449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2460a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2462124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      BuiltinTypeLoc T,
2463124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2464ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2465ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
2466ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
2467ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2468ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
2469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2473124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      ComplexTypeLoc T,
2474124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
24781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2480a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2481c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                      PointerTypeLoc TL,
2482124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2483c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType PointeeType
2484c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
248592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType.isNull())
248692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return QualType();
248792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
248892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  QualType Result = TL.getType();
2489c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (PointeeType->getAs<ObjCObjectType>()) {
249092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // A dependent pointer type 'T *' has is being transformed such
249192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // that an Objective-C class type is being replaced for 'T'. The
249292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // resulting pointer type is an ObjCObjectPointerType, not a
249392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // PointerType.
2494c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
2495c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2496c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
2497c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    NewT.setStarLoc(TL.getStarLoc());
249892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Result;
249992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2500c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
250192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (getDerived().AlwaysRebuild() ||
250292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      PointeeType != TL.getPointeeLoc().getType()) {
250392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
250492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Result.isNull())
250592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return QualType();
250692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2507c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
250892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
250992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2510c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Result;
2511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
25131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
25141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2515a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2516124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  BlockPointerTypeLoc TL,
2517124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  QualType ObjectType) {
2518db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  QualType PointeeType
2519c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2520c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (PointeeType.isNull())
2521c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return QualType();
2522c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2523c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType Result = TL.getType();
2524c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (getDerived().AlwaysRebuild() ||
2525c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      PointeeType != TL.getPointeeLoc().getType()) {
2526c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildBlockPointerType(PointeeType,
2527db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor                                                  TL.getSigilLoc());
2528db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor    if (Result.isNull())
2529db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor      return QualType();
2530db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  }
2531db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor
253239968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
2533db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2534db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  return Result;
2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
253785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
253885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
253985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
254085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
254185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
254285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
254385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2544124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ReferenceTypeLoc TL,
2545124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
254685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
254785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
254885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
254985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
255085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
255185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
255285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
255385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
255485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
255585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
255685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
255785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
255885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
255985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
256085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
256185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
256285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
256385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
256485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
256585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
256685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
256785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
256885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
256985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
257085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
257185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
257285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
257385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2577124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 LValueReferenceTypeLoc TL,
2578124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2579124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2585124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 RValueReferenceTypeLoc TL,
2586124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2587124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
25911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2593124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   MemberPointerTypeLoc TL,
2594124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
261185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
261285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
26231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
26241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2626124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ConstantArrayTypeLoc TL,
2627124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
263985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
264085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2644c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2646a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
26481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2662124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              IncompleteArrayTypeLoc TL,
2663124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              QualType ObjectType) {
2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2665a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2670a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
267485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
267585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2679c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2688577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2691124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   VariableArrayTypeLoc TL,
2692124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2698670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2699670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2700670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2710a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2715a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
271685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2717a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2719577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2720a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2721c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
27261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2728577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2733124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                             DependentSizedArrayTypeLoc TL,
2734124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2740670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2741670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
27421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2746577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2752a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2755a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
275885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2761577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2762a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
27631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2772577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2775577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2777124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      DependentSizedExtVectorTypeLoc TL,
2778124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2782577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2783577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2786670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2787670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2788670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2789577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2790577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2791577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2794a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2795eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2796eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2797a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2798577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2799577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2800a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2801a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2802a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2803a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2804a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2805a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2807a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2808a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2810a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2811a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2812a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2814a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2815a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2819a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2820124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     VectorTypeLoc 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();
2826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2827a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2828a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2829a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
283082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
2831788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      T->getAltiVecSpecific());
2832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2833a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2835c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2836a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2837a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2839a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2840577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2843a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2844124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        ExtVectorTypeLoc TL,
2845124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2846a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2847577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2848577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2851a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2852a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2853a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2854a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2855a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2856a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2857a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2858a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2860c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2861a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2862a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2864a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2865577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
286821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
286921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
287021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
287121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
287221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
287321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
287421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
287521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
287621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
287721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
287821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
287921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
288021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
288121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
288221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
288321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
288421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
288516573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                               OldParm->getStorageClassAsWritten(),
288621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
288721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
288821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
288921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
289021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
289121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
289221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<QualType> &PTypes,
289321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
28951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2897a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2898a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2902a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
290321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
290421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
290521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2906a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2907a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2908a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2909a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2910a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2911a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2913a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2914a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2915a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
291621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2917a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
29181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PTypes.push_back(NewType);
292021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PVars.push_back(NewParm);
2921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
29221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
292321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
292421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
292521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
292621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
292721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
292821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
292921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   FunctionProtoTypeLoc TL,
293021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   QualType ObjectType) {
2931895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // Transform the parameters. We do this first for the benefit of template
2932895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiations, so that the ParmVarDecls get/ placed into the template
2933895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiation scope before we transform the function type.
293421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
293521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
293621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
293721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return QualType();
2938c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2939895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  FunctionProtoType *T = TL.getTypePtr();
2940895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2941895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  if (ResultType.isNull())
2942895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor    return QualType();
2943c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2952fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getTypeQuals(),
2953fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getExtInfo());
2954a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2955a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2956a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
29571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2959a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2960a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2961a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2962a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2969a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2970124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 FunctionNoProtoTypeLoc TL,
2971124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 QualType ObjectType) {
2972a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2973a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2974a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2975a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2976a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2977a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2978a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2979a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2980a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2981a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2983a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2984a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2985a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2986a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2989ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2990ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2991124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 UnresolvedUsingTypeLoc TL,
2992124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2993ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
29947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2995ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
2996ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
2997ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2998ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
2999ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
3000ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
3001ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
3002ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
3003ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
3004ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3005ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
3006ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
3007ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
3008ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
3009ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3010ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
3011ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
3012ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3014a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
3015124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypedefTypeLoc TL,
3016124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
3017a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
3018577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
30197c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
30207c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
3021577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
3022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
3027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
3028a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3031a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3032a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
3033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3035a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
3040124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypeOfExprTypeLoc TL,
3041124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3042670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
3043670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3045cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3049a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3050a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3051cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
3052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
3053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
30571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3059cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3060cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3061cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3062a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
3068124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     TypeOfTypeLoc TL,
3069124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3070cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3071cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3072cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
3073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3076cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3077cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3080a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
30811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3083cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3084cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3085cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3086cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
3087a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
3093124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       DecltypeTypeLoc TL,
3094124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
3096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3097670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
3098670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
3101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
3107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
3108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
3112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
3114a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
3121124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     RecordTypeLoc TL,
3122124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
3124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
31257c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31267c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
3127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
3128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
3133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
3134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
31371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
3139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3142577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3145a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
3146124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   EnumTypeLoc TL,
3147124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
3149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
31507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
3152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
3153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
3158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
3159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3162a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
3164a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31687da2431c23ef1ee8acb114e39692246e1801afc2John McCall
31693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
31703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
31713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
31723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         InjectedClassNameTypeLoc TL,
31733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         QualType ObjectType) {
31743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
31753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
31763cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
31773cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31783cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
31793cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
31803cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
31813cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
31823cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
3186a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
3187124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                TemplateTypeParmTypeLoc TL,
3188124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                QualType ObjectType) {
3189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
3190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
319349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
3194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
3195124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         SubstTemplateTypeParmTypeLoc TL,
3196124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         QualType ObjectType) {
3197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
319849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
319949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
320049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
3201833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3202833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
3203833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3204833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
3205833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
3206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3207833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
3208833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
3209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
3210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
3211833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3212828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
3213828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
3214828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
3215828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
3216828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
3217833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3218833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
3219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
3220833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
3221833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
3222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3223833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3224833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
3225833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
3226dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
3227c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3228dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
3229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
3231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
3232833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3233833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
3234833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
32351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
3236dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
3237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
3238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
32391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3240d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
3241d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3242d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3243d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
3244d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
3245d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
3246d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
3247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
3248d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
3249d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
32501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3251833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
3252833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3253833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
3254833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
3255833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
3256d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
32571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3258833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
3259833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
3260833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
3261833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
3262833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
3263833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
3264833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
3265833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
3266833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
32671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3268833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
3269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3273465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
3274465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                ElaboratedTypeLoc TL,
3275465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                QualType ObjectType) {
3276465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType *T = TL.getTypePtr();
3277465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
3278465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  NestedNameSpecifier *NNS = 0;
3279465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  // NOTE: the qualifier in an ElaboratedType is optional.
3280465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  if (T->getQualifier() != 0) {
3281465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3282e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                    TL.getQualifierRange(),
3283465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                    ObjectType);
3284465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (!NNS)
3285465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return QualType();
3286465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
32871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3288e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType NamedT;
3289e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // FIXME: this test is meant to workaround a problem (failing assertion)
3290e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // occurring if directly executing the code in the else branch.
3291e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (isa<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc())) {
3292e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc OldNamedTL
3293e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = cast<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc());
3294e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    const TemplateSpecializationType* OldTST
32959cbb4d81b98ee84795e267d51c1fa530ef6723bfJim Grosbach      = OldNamedTL.getType()->template getAs<TemplateSpecializationType>();
3296e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = TransformTemplateSpecializationType(OldTST, ObjectType);
3297e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3298e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3299e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc NewNamedTL
3300e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
3301e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewNamedTL.copy(OldNamedTL);
3302e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3303e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  else {
3304e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
3305e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3306e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3307e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3308a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar
3309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
3312e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      NamedT != T->getNamedType()) {
3313e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, NamedT);
3314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3318465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3319e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setKeywordLoc(TL.getKeywordLoc());
3320e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setQualifierRange(TL.getQualifierRange());
3321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33264714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
33274714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor                                                       DependentNameTypeLoc TL,
3328124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
33294714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T = TL.getTypePtr();
3330833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
3332e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3333e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                TL.getQualifierRange(),
3334edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                ObjectType);
3335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
3336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
333833500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result
333933500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
334033500955d731c73717af52088b7fc0e7a85681e7John McCall                                            T->getIdentifier(),
334133500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getKeywordLoc(),
334233500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getQualifierRange(),
334333500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getNameLoc());
3344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
3346a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3347e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
3348e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    QualType NamedT = ElabT->getNamedType();
334933500955d731c73717af52088b7fc0e7a85681e7John McCall    TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
335033500955d731c73717af52088b7fc0e7a85681e7John McCall
3351e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3352e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3353e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
335433500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3355e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
3356e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3357e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
3358e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setNameLoc(TL.getNameLoc());
3359e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
336433500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>::
336533500955d731c73717af52088b7fc0e7a85681e7John McCall          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
336633500955d731c73717af52088b7fc0e7a85681e7John McCall                                 DependentTemplateSpecializationTypeLoc TL,
336733500955d731c73717af52088b7fc0e7a85681e7John McCall                                                       QualType ObjectType) {
336833500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType *T = TL.getTypePtr();
336933500955d731c73717af52088b7fc0e7a85681e7John McCall
337033500955d731c73717af52088b7fc0e7a85681e7John McCall  NestedNameSpecifier *NNS
337133500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
337233500955d731c73717af52088b7fc0e7a85681e7John McCall                                                TL.getQualifierRange(),
337333500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ObjectType);
337433500955d731c73717af52088b7fc0e7a85681e7John McCall  if (!NNS)
337533500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
337633500955d731c73717af52088b7fc0e7a85681e7John McCall
337733500955d731c73717af52088b7fc0e7a85681e7John McCall  TemplateArgumentListInfo NewTemplateArgs;
337833500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
337933500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
338033500955d731c73717af52088b7fc0e7a85681e7John McCall
338133500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = T->getNumArgs(); I != E; ++I) {
338233500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateArgumentLoc Loc;
338333500955d731c73717af52088b7fc0e7a85681e7John McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(I), Loc))
338433500955d731c73717af52088b7fc0e7a85681e7John McCall      return QualType();
338533500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTemplateArgs.addArgument(Loc);
338633500955d731c73717af52088b7fc0e7a85681e7John McCall  }
338733500955d731c73717af52088b7fc0e7a85681e7John McCall
338833500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
338933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getKeyword(),
339033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NNS,
339133500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getIdentifier(),
339233500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     TL.getNameLoc(),
339333500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NewTemplateArgs);
339433500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Result.isNull())
339533500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
339633500955d731c73717af52088b7fc0e7a85681e7John McCall
339733500955d731c73717af52088b7fc0e7a85681e7John McCall  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
339833500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType NamedT = ElabT->getNamedType();
339933500955d731c73717af52088b7fc0e7a85681e7John McCall
340033500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the template specialization.
340133500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateSpecializationTypeLoc NamedTL
340233500955d731c73717af52088b7fc0e7a85681e7John McCall      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
340333500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setLAngleLoc(TL.getLAngleLoc());
340433500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setRAngleLoc(TL.getRAngleLoc());
340533500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
340633500955d731c73717af52088b7fc0e7a85681e7John McCall      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
340733500955d731c73717af52088b7fc0e7a85681e7John McCall
340833500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the elaborated type.
340933500955d731c73717af52088b7fc0e7a85681e7John McCall    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
341033500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setKeywordLoc(TL.getKeywordLoc());
341133500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setQualifierRange(TL.getQualifierRange());
341233500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3413e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TypeLoc NewTL(Result, TL.getOpaqueData());
3414e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TLB.pushFullCopy(NewTL);
341533500955d731c73717af52088b7fc0e7a85681e7John McCall  }
341633500955d731c73717af52088b7fc0e7a85681e7John McCall  return Result;
341733500955d731c73717af52088b7fc0e7a85681e7John McCall}
341833500955d731c73717af52088b7fc0e7a85681e7John McCall
341933500955d731c73717af52088b7fc0e7a85681e7John McCalltemplate<typename Derived>
3420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3422124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ObjCInterfaceTypeLoc TL,
3423124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3424ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCInterfaceType is never dependent.
3425c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3426c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return TL.getType();
3427c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3428c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
3429c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived>
3430c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType
3431c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
3432c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                ObjCObjectTypeLoc TL,
3433c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                QualType ObjectType) {
3434c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCObjectType is never dependent.
3435c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3436ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
3437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3442124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjCObjectPointerTypeLoc TL,
3443124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3444ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCObjectPointerType is never dependent.
3445c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3446ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
344724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
344824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
345143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
34551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
345843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
346143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
346343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
346443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
346543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
346743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
346843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
346943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
347043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
347143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
347243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
347343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
347443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
34751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
347643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
347743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
347843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
348043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
348143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
348343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
348443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
348543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
348643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
348743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
348843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
349143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3493264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  OwningExprResult LHS(SemaRef), RHS(SemaRef);
3494264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3495264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3496264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
34971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3498264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3499264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3500264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3501264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
35021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3503264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3504264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3505264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3506264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3507264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
35081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
351043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
351143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
351243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
351343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
351443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
351543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
351643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
351743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
351843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
352143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
352243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
352343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
352643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
352743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
352843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
352943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
353043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
353243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
353343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
353443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
353543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
353743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
353843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
353943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
354043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
354243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
354343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
354543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
354643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
354743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
354943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
355043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
355143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
355243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
355343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
355543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
35561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
35571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
355843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
35598cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  OwningExprResult Cond(SemaRef);
35608cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
35618cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
3562c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
35638cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
3564aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3565aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3566aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
35678cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
35688cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
356999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
35708cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3571c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
357299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
357399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3574eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
3575eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    // Convert the condition to a boolean value.
3576afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3577afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3578afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getIfLoc(),
3579afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               move(Cond));
3580afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3581afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3582eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
3583afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      Cond = move(CondE);
3584afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
358599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
3586c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3587eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3588eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3589eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3590eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
359143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
359243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
359343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
359443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
359643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
359743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
359843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
359943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
360143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3602eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor      FullCond->get() == S->getCond() &&
360399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
360443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
360543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
36061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3608eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
360999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Then),
36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
361143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
361243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
361343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
361443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
36151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
361643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
3617d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  OwningExprResult Cond(SemaRef);
3618d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3619d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3620c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
3621d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3622aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3623aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3624aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
3625d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3626d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
362799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3628d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3629c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
363099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
363199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
363299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
363443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
3635586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult Switch
3636586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), move(Cond),
3637586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          ConditionVar);
363843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
363943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
364143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
364243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
364343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
364443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
364643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
364743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
364843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
364943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
365143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
365243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
36531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
365443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
36555656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  OwningExprResult Cond(SemaRef);
36565656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
36575656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
3658c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
36595656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
3660aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3661aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3662aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
36635656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
36645656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
366599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
36665656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3667c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
366899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
366999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3670afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3671afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3672afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
3673afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3674eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                                             S->getWhileLoc(),
3675afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               move(Cond));
3676afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3677afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3678afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      Cond = move(CondE);
3679afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
368099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3682eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3683eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3684eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3685eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
368643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
368743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
368843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
368943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
369143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3692eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor      FullCond->get() == S->getCond() &&
369399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
369443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3697eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
3698586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                       ConditionVar, move(Body));
369943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
370243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
370343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
370443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
370543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
370643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
370743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3709eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  // Transform the condition
3710eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3711eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (Cond.isInvalid())
3712eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3713eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
371443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
371543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
371643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
37171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
37181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
371943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
372043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
372143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
372243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
372443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
372543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
372743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
372843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
372943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
373043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
373243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
373399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningExprResult Cond(SemaRef);
373499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
373599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
3736c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
373799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
3738aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3739aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3740aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
374199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
374299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
374399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
374499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3745c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
374699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
374799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3748afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3749afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3750afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
3751afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3752afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getForLoc(),
3753afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               move(Cond));
3754afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3755afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3756afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3757afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      Cond = move(CondE);
3758afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
375999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3761eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3762eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3763eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3764eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
376543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
376643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
376743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
376843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3770eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc));
3771eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (S->getInc() && !FullInc->get())
3772eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3773eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
377443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
377543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
377643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
377743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
377943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
378043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
3781eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor      FullCond->get() == S->getCond() &&
378243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
378343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
37841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
37851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
378643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
3787eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                     move(Init), FullCond, ConditionVar,
3788eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                     FullInc, S->getRParenLoc(), move(Body));
378943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
379043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
379143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
37921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
37931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
379443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
37951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
379643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
379743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
379843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
379943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
380043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
380243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
380343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
380443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
38051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
380643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
380743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
38081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
380943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
381043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
381143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
381243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
381343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
381443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
381543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
38171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
381843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
382143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
38231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
382443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
382743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
382943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
383043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
383143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
383243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
383443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
383543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
383643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
383943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
384143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
384243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
384343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
384443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
3845aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
3846aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                         *D);
384743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
384843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
38491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
385043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
385143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
38521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
385343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
385443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
38551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
385643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
38571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
38581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
386043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
386143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
386343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
386443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
386643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
38671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
386843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
386943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
387043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
387143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
387243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3873c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3874703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema());
3875703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema());
3876ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 4> Names;
3877a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
3878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningExprResult AsmString(SemaRef);
3879703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema());
3880703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  bool ExprsChanged = false;
3882c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3883703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the outputs.
3884703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
3885ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getOutputIdentifier(I));
3886c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3887703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain());
3889c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3890703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the output expr.
3891703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *OutputExpr = S->getOutputExpr(I);
3892703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(OutputExpr);
3893703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3894703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3895c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3896703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != OutputExpr;
3897c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3898703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Exprs.push_back(Result.takeAs<Expr>());
3899703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3900c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3901703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the inputs.
3902703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
3903ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getInputIdentifier(I));
3904c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3905703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3906703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain());
3907c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3908703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the input expr.
3909703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *InputExpr = S->getInputExpr(I);
3910703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(InputExpr);
3911703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3912703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3913c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3914703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != InputExpr;
3915c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3916703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Exprs.push_back(Result.takeAs<Expr>());
3917703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3918c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3919703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
3920703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    return SemaRef.Owned(S->Retain());
3921703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3922703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the clobbers.
3923703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
3924703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Clobbers.push_back(S->getClobber(I)->Retain());
3925703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3926703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // No need to transform the asm string literal.
3927703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  AsmString = SemaRef.Owned(S->getAsmString());
3928703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3929703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
3930703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isSimple(),
3931703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isVolatile(),
3932703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumOutputs(),
3933703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumInputs(),
3934a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson                                     Names.data(),
3935703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Constraints),
3936703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Exprs),
3937703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move(AsmString),
3938703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Clobbers),
3939703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getRParenLoc(),
3940703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isMSAsm());
394143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
394243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
394343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
394443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
394543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
39474dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body of the @try.
39484dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
39494dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (TryBody.isInvalid())
39504dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
3951c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39528f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  // Transform the @catch statements (if present).
39538f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool AnyCatchChanged = false;
39548f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> CatchStmts(SemaRef);
39558f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
39568f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
39574dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Catch.isInvalid())
39584dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
39598f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    if (Catch.get() != S->getCatchStmt(I))
39608f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      AnyCatchChanged = true;
39618f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    CatchStmts.push_back(Catch.release());
39624dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
3963c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39644dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the @finally statement (if present).
39654dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult Finally(SemaRef);
39664dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (S->getFinallyStmt()) {
39674dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    Finally = getDerived().TransformStmt(S->getFinallyStmt());
39684dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Finally.isInvalid())
39694dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
39704dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
39714dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
39724dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
39734dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
39744dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      TryBody.get() == S->getTryBody() &&
39758f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      !AnyCatchChanged &&
39764dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Finally.get() == S->getFinallyStmt())
39774dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
3978c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39794dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
39804dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), move(TryBody),
39818f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                           move_arg(CatchStmts), move(Finally));
398243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
398443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
398543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
3987be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  // Transform the @catch parameter, if there is one.
3988be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *Var = 0;
3989be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (VarDecl *FromVar = S->getCatchParamDecl()) {
3990be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    TypeSourceInfo *TSInfo = 0;
3991be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (FromVar->getTypeSourceInfo()) {
3992be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
3993be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (!TSInfo)
3994be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor        return SemaRef.StmtError();
3995be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3996c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3997be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    QualType T;
3998be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (TSInfo)
3999be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = TSInfo->getType();
4000be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    else {
4001be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = getDerived().TransformType(FromVar->getType());
4002be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (T.isNull())
4003c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt        return SemaRef.StmtError();
4004be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
4005c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4006be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
4007be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (!Var)
4008be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      return SemaRef.StmtError();
4009be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
4010c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4011be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getCatchBody());
4012be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (Body.isInvalid())
4013be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return SemaRef.StmtError();
4014c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4015c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
4016be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             S->getRParenLoc(),
4017be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             Var, move(Body));
401843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
402043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
402143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
40221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
40234dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body.
40244dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
40254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (Body.isInvalid())
40264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
4027c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40284dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
40294dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
40304dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Body.get() == S->getFinallyBody())
40314dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
40324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
40334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
40344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
40354dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                               move(Body));
403643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
403843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
403943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
40401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
4041d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  OwningExprResult Operand(SemaRef);
4042d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (S->getThrowExpr()) {
4043d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    Operand = getDerived().TransformExpr(S->getThrowExpr());
4044d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    if (Operand.isInvalid())
4045d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      return getSema().StmtError();
4046d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
4047c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4048d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4049d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      Operand.get() == S->getThrowExpr())
4050d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    return getSema().Owned(S->Retain());
4051c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4052d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), move(Operand));
405343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
405543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
405643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
405743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
40598fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the object we are locking.
40608fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
40618fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Object.isInvalid())
40628fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
4063c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40648fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the body.
40658fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getSynchBody());
40668fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Body.isInvalid())
40678fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
4068c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40698fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // If nothing change, just retain the current statement.
40708fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
40718fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Object.get() == S->getSynchExpr() &&
40728fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Body.get() == S->getSynchBody())
40738fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.Owned(S->Retain());
40748fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor
40758fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Build a new statement.
40768fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
40778fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                    move(Object), move(Body));
407843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
407943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
408043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
408143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
408243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
40831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
4084c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the element statement.
4085c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult Element = getDerived().TransformStmt(S->getElement());
4086c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Element.isInvalid())
4087c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4088c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4089c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the collection expression.
4090c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningExprResult Collection = getDerived().TransformExpr(S->getCollection());
4091c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Collection.isInvalid())
4092c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4093c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4094c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the body.
4095c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
4096c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Body.isInvalid())
4097c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4098c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4099c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // If nothing changed, just retain this statement.
4100c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
4101c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Element.get() == S->getElement() &&
4102c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Collection.get() == S->getCollection() &&
4103c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Body.get() == S->getBody())
4104c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.Owned(S->Retain());
4105c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4106c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Build a new statement.
4107c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
4108c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   /*FIXME:*/S->getForLoc(),
4109c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Element),
4110c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Collection),
4111c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   S->getRParenLoc(),
4112c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Body));
411343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
411443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
411543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
411643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
411743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
411843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
411943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
412043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
412143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
412243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
412343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
412443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
412543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
412643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
412743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
412843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
41291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
413043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
413143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
4132a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                            ExceptionDecl->getTypeSourceInfo(),
413343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
413443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
413543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
413643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
4137ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor    if (!Var || Var->isInvalidDecl())
413843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
413943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
414143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
414243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
4143ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor  if (Handler.isInvalid())
414443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
41451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
414643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
414743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
414843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
41491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
415043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
415143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
415243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
415343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
415443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
41551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
415643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
415743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
415843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
415943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
41601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
416143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
416243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
416343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
41641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
416543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
416643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
416743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
416843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
41691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
417043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
417143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
417243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
41731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
417443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
417543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
417643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
417843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
417943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
418043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
41811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
418243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
418343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
41841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
418543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
41861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
418743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
4189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
41901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4192454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
41931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
41941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
41951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4198454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
4199a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
4200a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
4201a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4202edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                       E->getQualifierRange());
4203a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
4204a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
4205a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4206dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4207dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
42087c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
42097c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getDecl()));
4210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4213ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  DeclarationNameInfo NameInfo = E->getNameInfo();
4214ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  if (NameInfo.getName()) {
4215ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
4216ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    if (!NameInfo.getName())
4217ec8045d3f0375302eadaa63deb373bacaf25a569John McCall      return SemaRef.ExprError();
4218ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  }
42192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
42202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!getDerived().AlwaysRebuild() &&
4221a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
4222a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
42232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NameInfo.getName() == E->getDecl()->getDeclName() &&
4224096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
42251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4226dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
4227dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
4228dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
4229a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
4230dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return SemaRef.Owned(E->Retain());
4231a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4232dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4233dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
4234096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
4235dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
4236dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4237dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
4238dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4239dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TemplateArgumentLoc Loc;
4240dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4241dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall        return SemaRef.ExprError();
4242dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TransArgs.addArgument(Loc);
4243dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    }
4244dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
4245dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4246a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
42472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, TemplateArgs);
4248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4252454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
42531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4258454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
42591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4264454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
42651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
42691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4270454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
42711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4276454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
42771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4282454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
42881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
4291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
42941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
42951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4296454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
4297454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
43021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
43101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
43118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
43128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform the type.
43138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
43148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!Type)
43158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().ExprError();
4316c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform all of the components into components similar to what the
43188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // parser uses.
4319c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // FIXME: It would be slightly more efficient in the non-dependent case to
4320c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // just map FieldDecls, rather than requiring the rebuilder to look for
4321c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // the fields again. However, __builtin_offsetof is rare enough in
43228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // template code that we don't care.
43238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool ExprChanged = false;
43248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef Action::OffsetOfComponent Component;
43258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
43268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  llvm::SmallVector<Component, 4> Components;
43278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
43288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    const Node &ON = E->getComponent(I);
43298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Component Comp;
433072be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor    Comp.isBrackets = true;
43318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocStart = ON.getRange().getBegin();
43328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocEnd = ON.getRange().getEnd();
43338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
43348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array: {
43358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
43368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(FromIndex);
43378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (Index.isInvalid())
43388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return getSema().ExprError();
4339c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      ExprChanged = ExprChanged || Index.get() != FromIndex;
43418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = true;
43428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.E = Index.takeAs<Expr>(); // FIXME: leaked
43438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
43448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4345c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
43478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
43488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = false;
43498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.IdentInfo = ON.getFieldName();
435029d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor      if (!Comp.U.IdentInfo)
435129d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor        continue;
4352c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4354c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4355cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case Node::Base:
4356cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Will be recomputed during the rebuild.
4357cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
43588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4359c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Components.push_back(Comp);
43618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
4362c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // If nothing changed, retain the existing expression.
43648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
43658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Type == E->getTypeSourceInfo() &&
43668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      !ExprChanged)
43678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return SemaRef.Owned(E->Retain());
4368c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Build a new offsetof expression.
43708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
43718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          Components.data(), Components.size(),
43728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          E->getRParenLoc());
43738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
43748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
43758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived>
43768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorSema::OwningExprResult
4377454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
4379a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
43805557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
4381a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
43825ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43855ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
43871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43885ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
43891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
43941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
43991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
44141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4415454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
44371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4438454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
44561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
44671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
44761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4477454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
448283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
448383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
44841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
448583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4486edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  E->getQualifierRange());
4487c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
448883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
448983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
44901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4491f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
44927c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
44937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getMemberDecl()));
4494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
4495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44976bb8017bb9e828d118e15e59d71c66bba323c364John McCall  NamedDecl *FoundDecl = E->getFoundDecl();
44986bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (FoundDecl == E->getMemberDecl()) {
44996bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = Member;
45006bb8017bb9e828d118e15e59d71c66bba323c364John McCall  } else {
45016bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = cast_or_null<NamedDecl>(
45026bb8017bb9e828d118e15e59d71c66bba323c364John McCall                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
45036bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!FoundDecl)
45046bb8017bb9e828d118e15e59d71c66bba323c364John McCall      return SemaRef.ExprError();
45056bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
45066bb8017bb9e828d118e15e59d71c66bba323c364John McCall
4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
450983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
45108a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
45116bb8017bb9e828d118e15e59d71c66bba323c364John McCall      FoundDecl == E->getFoundDecl() &&
4512096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
4513c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
45141f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
45151f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
45161f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
45171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45181f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
4519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4520d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
4521096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
4522d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4523d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
45248a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4525d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
4526d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
45278a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
4528d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
45298a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
45308a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
4531c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4536c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
4537c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
4538c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
4539c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
4540c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
4541c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
454483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
454583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
45462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                        E->getMemberNameInfo(),
45478a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
45486bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                        FoundDecl,
4549096832c5ed5b9106fa177ebc148489760c3bc496John McCall                                        (E->hasExplicitTemplateArgs()
4550d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
4551c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4556454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
4557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
45681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
4571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
45741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
4577454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
4578454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
4579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4583454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
4584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
46011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
460347e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
46041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
460547e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
4606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
4607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
46101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4611454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
4612a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
4613a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
46146eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4619454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
46209d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
46219d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
46241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
46271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46289d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
46299d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
46309d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4634a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
46356eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
46409d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
46421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
46459d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            NewT,
4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4652454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
465342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
465442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
465542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
465642f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return SemaRef.ExprError();
46571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
4659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
466342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      OldT == NewT &&
4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
46651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
46671d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // Note: the expression type doesn't necessarily match the
46681d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // type-as-written, but that's okay, because it should always be
46691d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // derivable from the initializer.
46701d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
467142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4678454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
46851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4697454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
46991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
47111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
47121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
4714e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
4715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4719454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
472243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
4724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
472743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
4728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
47441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
47471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
47521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
47541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
47671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
47701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
47861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
4788454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
47895557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4790c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
47915557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
47925557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
47991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
48051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4806454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
48079bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
48089bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo)
48099bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
48101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
48162cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara      TInfo == E->getWrittenTypeInfo() &&
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
48191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
48212cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                       TInfo, E->getRParenLoc());
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
48251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4826454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4850454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4856c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntSema::OwningExprResult
4857454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
4859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
48661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
4869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4874454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
48753fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  TypeSourceInfo *TInfo1;
48763fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  TypeSourceInfo *TInfo2;
48779bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor
48789bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TInfo1 = getDerived().TransformType(E->getArgTInfo1());
48799bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo1)
48809bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
48811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48829bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TInfo2 = getDerived().TransformType(E->getArgTInfo2());
48839bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo2)
48849bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
4885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
48873fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara      TInfo1 == E->getArgTInfo1() &&
48883fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara      TInfo2 == E->getArgTInfo2())
48891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
48923fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                                 TInfo1, TInfo2,
48933fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                                 E->getRParenLoc());
4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4898454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
49151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
49161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
4919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
49231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4924454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
49251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4930454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4931668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
4932668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
4933668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
4934668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
4935668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
4936668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4937668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4938c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4939668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
4940668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
4941668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4942668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4943668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
4944668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4945668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4946668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      return SemaRef.ExprError();
4947668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4948668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
4949668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
4950668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
4951668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
4952668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4953668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
4954668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4955668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4956668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
49576eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      if (getDerived().DropCallArgument(E->getArg(I)))
49586eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor        break;
4959c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4960668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4961668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4962668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        return SemaRef.ExprError();
4963668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4964668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      // FIXME: Poor source location information.
4965668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      SourceLocation FakeCommaLoc
4966668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        = SemaRef.PP.getLocForEndOfToken(
4967668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4968668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      FakeCommaLocs.push_back(FakeCommaLoc);
4969668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      Args.push_back(Arg.release());
4970668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    }
4971668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4972668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc,
4973668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
4974668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        FakeCommaLocs.data(),
4975668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
4976668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4977668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4978668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4979668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
4980668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4981668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
4982668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
4983668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
4984668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
4985668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4986668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
4987668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
4988668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4989668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4990668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4991668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4992668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4993668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4994668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4995668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5000454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
5001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
5002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
5006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
5008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
5013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
50141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
50151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
5018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
50191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
5020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
5021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
5022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5026454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
5027454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
50311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5032454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
50339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
50349d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
50371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
50401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50419d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
50429d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
50439d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5047a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
50486eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
50539d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
50551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
50581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
5059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
5061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
5062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
50651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
5066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
50679d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                              NewT,
5068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
5071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
5072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
50751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5076454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
5077454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5082454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
5083454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
5089454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
5090454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5095454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
5096454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
5102454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
51039d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
51049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
51071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
51099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
51109d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5114a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
51156eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
51209d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
51221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
51279d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                   NewT,
5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
5130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
5131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5135454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
513757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    TypeSourceInfo *TInfo
513857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor      = getDerived().TransformType(E->getTypeOperandSourceInfo());
513957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    if (!TInfo)
5140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
514357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor        TInfo == E->getTypeOperandSourceInfo())
5144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
51451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
514657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getType(),
514757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             E->getLocStart(),
514857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             TInfo,
5149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
5150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
5153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
51551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
51571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
5159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
51641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
516657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getType(),
516757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                           E->getLocStart(),
5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
5169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
5170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
51731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5174454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
51751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
5181454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
51821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5187454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
5188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
51891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
5196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
51971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5198828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5203454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
52101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
5213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5217454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
52181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
52197c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
52207c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
5221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
5222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
522453cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
5225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
5226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
52271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5228036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
5229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5233ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
5234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
52421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
52431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5244ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  return getDerived().RebuildCXXScalarValueInitExpr(E->getTypeBeginLoc(),
5245ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                 /*FIXME:*/E->getTypeBeginLoc(),
5246ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    T,
5247ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    E->getRParenLoc());
5248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5252454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
5253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
5254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
5256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
5257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
5260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
5261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
5262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
5265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
5267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
5268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
5269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
52711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
5273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
5274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
527643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
5277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
5278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
5279ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor    if (getDerived().DropCallArgument(E->getConstructorArg(I)))
5280ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor      break;
5281ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor
5282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
5283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
52851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
5287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
5288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52901af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
52911af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
52921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
52931af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
52947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
52961af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
52971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
53001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
53011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
53021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
53037c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
53047c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
53051af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
53061af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
53071af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53081af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
53091af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
53101af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
53111af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
53127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
53137c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
53141af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
53151af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
53161af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5317c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
5320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
53211af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
53221af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
53231af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
53241af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
53251af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53271af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
53281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
53291af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
53301af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
53311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53341af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53365b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
53375b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
53385b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
53395b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
53405b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
53415b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
53425b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
53435b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
53445b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
53455b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
53465b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
5347c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      ArraySize
53485b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
5349c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                  ConsArrayT->getSize(),
53505b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  SemaRef.Context.getSizeType(),
53515b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  /*FIXME:*/E->getLocStart()));
53525b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
53535b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
53545b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
53555b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
53565b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
53575b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
53585b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
53595b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
53605b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
5361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
5362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
5363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
5365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
53664bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                        E->getTypeIdParens(),
5367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
5368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
5370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
5371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
53731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
5374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5378454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
5379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
5380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
5381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
53821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53831af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
53841af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
53851af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
53861af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
53877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
53887c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
53891af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
53901af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
53911af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5392c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
53941af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
53951af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
53961af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
54001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
54011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
54021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
5404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
5405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
5406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
5407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5411a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
5412454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
5413a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
5414a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
5415a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
54161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5417a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  Sema::TypeTy *ObjectTypePtr = 0;
5418a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
5419c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5420a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
5421a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
5422a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
5423a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
5424a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
5425a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    return SemaRef.ExprError();
5426c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5427a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr);
5428a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
5429a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5430b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor                                                E->getQualifierRange(),
5431a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                ObjectType);
5432a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
5433a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
54341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5435a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
5436a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
5437a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
5438a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
5439a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
5440a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5441a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
5442a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
5443a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
5444a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
5445a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
5446a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
5447a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
5448a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
5449a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    CXXScopeSpec SS;
5450a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (Qualifier) {
5451a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setScopeRep(Qualifier);
5452a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setRange(E->getQualifierRange());
5453a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    }
5454c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5455a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(),
5456a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
5457a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
5458a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
5459a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
5460a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
5461a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
5462a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5463c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5464a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
5465a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
5466a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
5467a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
546826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
546926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
547026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
5471c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
5472a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                               ObjectType);
547326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
5474a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
5475a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
5476c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5477a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
5478a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
5479a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
5480a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
548126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getQualifierRange(),
548226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
548326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
5484fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
5485a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
5486a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
54871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5488a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
5489a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
5490ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
5491454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
5492f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
5493f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5494f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
5495f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
5496f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5497f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
5498f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
5499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
55007c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
55017c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
55027c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
55039f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
55049f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
55059f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
55069f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
55079f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
55089f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
55099f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
55109f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5511f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5512f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
5513f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
5514f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5515f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5516f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
5517f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
5518f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
5519f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
5520f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5521f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
5522f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5523f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5524f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
5525f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
5526f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
5527f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5528f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
5529f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
5530f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
5531f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
5532f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5533edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                    Old->getQualifierRange());
5534f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
5535f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5536c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5537f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
5538f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
5539c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  }
5540c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5541c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (Old->getNamingClass()) {
554266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    CXXRecordDecl *NamingClass
554366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
554466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                            Old->getNameLoc(),
554566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
554666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
554766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5548c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
554966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5550f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5551f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5552f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
5553f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
5554f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
5555f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5556f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
5557f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
5558f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
5559f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5560f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
5561f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
5562f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5563f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
5564f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5565f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5566f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
5567f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5572454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
5573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
55741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
5576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
5581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
55821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
5584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
5585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
55861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
5588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
5589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
5590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
5591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
5592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5596865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
55972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               DependentScopeDeclRefExpr *E) {
5598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
5599f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5600edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                E->getQualifierRange());
5601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
5602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
56052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
56062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
560781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
56081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5609f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
5610f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
5611f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
56122577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // Note: it is sufficient to compare the Name component of NameInfo:
56132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // if name has not changed, DNLoc has not changed either.
56142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getDeclName())
5615f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
56161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5617f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5618f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
56192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                         NameInfo,
5620f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
5621f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
5622d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
5623d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5625d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5626d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5628d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
5629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5631f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5632f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
56332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
5634f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
5635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5639454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
5640321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
5641321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
5642321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
5643321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5644321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
5645321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
5646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
56547c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
56557c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
56611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
5663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
56646eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
56656eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
56666eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
56676eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
56686eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
5669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
56721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
5675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
5680c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
56811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
56821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
5683c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
5685c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
56861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56874411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
56884411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
5689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
5690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
5693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56945132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
56955132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
5696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5698454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
56995132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5702eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// \brief Transform a C++ reference-binding expression.
5703eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson///
5704eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// Since CXXBindReferenceExpr nodes are implicitly generated, we just
5705eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// transform the subexpression and return that.
5706eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssontemplate<typename Derived>
5707eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonSema::OwningExprResult
5708eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonTreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
5709eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  return getDerived().TransformExpr(E->getSubExpr());
5710eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
5711eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
57121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
5713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
5714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
57155132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
57165132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
5717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
57205132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
57215132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5727454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXTemporaryObjectExpr *E) {
5728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
5735c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                  getDerived().TransformDecl(E->getLocStart(),
57367c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
57431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
5745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
574691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
574791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      ArgumentChanged = true;
574891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      break;
574991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    }
575091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor
5751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
57541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
5757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
576291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
576391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
576491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
5765a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth    return SemaRef.MaybeBindToTemporary(E->Retain());
576691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
57671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
5769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
5770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
5771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
57721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
5773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
5774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
5776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
5777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
5778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
5779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
5780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
5781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5786454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
5787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
5789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
5795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
5797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
5798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
58011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
5804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
5805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
5806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
58071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
5810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
58111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
58121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
5814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
5815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
5816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
5817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
5818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
5819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
5820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
58211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5824865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
58252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                             CXXDependentScopeMemberExpr *E) {
5826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
5827aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
5828aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
5829aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5830aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
5831aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
5832aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
5833aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
5834aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5835aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
58361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5837aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
5838aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Sema::TypeTy *ObjectTy = 0;
5839d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
5840aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5841aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
5842a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
5843d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
5844d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
5845aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5846aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5847aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
5848aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
5849aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5850aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5851aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
5852aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
5853aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5854aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
58551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
58576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
5858c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
58596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
58606cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
58616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
58621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5863a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
5864a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
5865a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5866a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
5867aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
5868aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
5869a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
5870a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
5871a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
58721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
58742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo(),
58752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                ObjectType);
58762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
587781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
58781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5879aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
58803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
58813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
58823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
5883aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
5884aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
58853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
58862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getMember() &&
58873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
58881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
58891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5890865d447ac6a4721ab58e898d014a21f2eff74b06John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5891aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
58923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
58933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
58943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
58953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
5896129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
58972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
5898129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
58993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
59003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
5901d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
59023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5903d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5904d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
59053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
5906d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
59073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
59081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5909865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5910aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
5911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
5912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
5913a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
5914a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
59153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
59162577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                     NameInfo,
5917129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
5918129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
5919129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5920129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
5921129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult
5922454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5923129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
5924aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
5925aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5926aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
5927aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
5928aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5929aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5930aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5931aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5932aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5933aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5934129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5935129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5936129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5937129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5938129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5939edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  Old->getQualifierRange());
5940129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5941129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      return SemaRef.ExprError();
5942129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5943129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
59442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  LookupResult R(SemaRef, Old->getMemberNameInfo(),
5945129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5946129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5947129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5948129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5949129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
59507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
59517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
59527c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
59539f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
59549f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
59559f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
59569f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
59579f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
59589f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
59599f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
59609f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5961129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5962129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5963129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5964129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5965129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5966129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5967129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5968129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5969129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5970129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5971129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5972129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5973129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5974129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5975129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5976c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  // Determine the naming class.
5977042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth  if (Old->getNamingClass()) {
5978c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    CXXRecordDecl *NamingClass
5979c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
598066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                          Old->getMemberLoc(),
598166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
598266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
598366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5984c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
598566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5986c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
5987c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5988129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5989129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5990129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5991129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5992129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5993129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5994129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5995129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5996129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        return SemaRef.ExprError();
5997129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5998129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5999129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
6000c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
6001c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
6002c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
6003c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
6004c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
6005c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
6006c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6007129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  return getDerived().RebuildUnresolvedMemberExpr(move(Base),
6008aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
6009129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
6010129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
6011129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
6012129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
6013c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
6014129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
6015129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
6016129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
6017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
6021454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
60221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6027454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
602881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *EncodedTypeInfo
602981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
603081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!EncodedTypeInfo)
6031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
60321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
603481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
60351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
6036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
603881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                            EncodedTypeInfo,
6039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
6040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
6044454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
604592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Transform arguments.
604692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  bool ArgChanged = false;
604792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
604892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
604992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
605092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Arg.isInvalid())
605192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
6052c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
605392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
605492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Args.push_back(Arg.takeAs<Expr>());
605592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
605692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
605792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
605892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Class message: transform the receiver type.
605992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    TypeSourceInfo *ReceiverTypeInfo
606092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      = getDerived().TransformType(E->getClassReceiverTypeInfo());
606192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!ReceiverTypeInfo)
606292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
6063c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
606492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If nothing changed, just retain the existing message send.
606592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
606692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
606792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.Owned(E->Retain());
606892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
606992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Build a new class message send.
607092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
607192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getSelector(),
607292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getMethodDecl(),
607392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getLeftLoc(),
607492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               move_arg(Args),
607592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getRightLoc());
607692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
607792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
607892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Instance message: transform the receiver
607992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
608092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor         "Only class and instance messages may be instantiated");
608192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult Receiver
608292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    = getDerived().TransformExpr(E->getInstanceReceiver());
608392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (Receiver.isInvalid())
608492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.ExprError();
608592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
608692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // If nothing changed, just retain the existing message send.
608792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
608892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
608992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.Owned(E->Retain());
6090c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
609192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Build a new instance message send.
609292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  return getDerived().RebuildObjCMessageExpr(move(Receiver),
609392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getSelector(),
609492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getMethodDecl(),
609592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getLeftLoc(),
609692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             move_arg(Args),
609792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getRightLoc());
6098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6102454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
61031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6108454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
6109ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return SemaRef.Owned(E->Retain());
6110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6114454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
6115f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
6116f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6117f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6118f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6119f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor
6120f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // We don't need to transform the ivar; it will never change.
6121c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6122f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6123f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6124f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6125f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6126c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6127f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  return getDerived().RebuildObjCIvarRefExpr(move(Base), E->getDecl(),
6128f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->getLocation(),
6129f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->isArrow(), E->isFreeIvar());
6130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6134454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
6135e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // Transform the base expression.
6136e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6137e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (Base.isInvalid())
6138e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.ExprError();
6139c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6140e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // We don't need to transform the property; it will never change.
6141c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6142e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // If nothing changed, just retain the existing expression.
6143e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6144e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      Base.get() == E->getBase())
6145e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.Owned(E->Retain());
6146c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6147e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  return getDerived().RebuildObjCPropertyRefExpr(move(Base), E->getProperty(),
6148e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                 E->getLocation());
6149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
615309105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
6154454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
61559cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If this implicit setter/getter refers to class methods, it cannot have any
61569cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // dependent parts. Just retain the existing declaration.
61579cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (E->getInterfaceDecl())
61589cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6159c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61609cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // Transform the base expression.
61619cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
61629cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (Base.isInvalid())
61639cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.ExprError();
6164c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61659cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // We don't need to transform the getters/setters; they will never change.
6166c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61679cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If nothing changed, just retain the existing expression.
61689cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
61699cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor      Base.get() == E->getBase())
61709cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6171c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61729cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
61739cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getGetterMethod(),
61749cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getType(),
61759cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getSetterMethod(),
61769cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getLocation(),
61779cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             move(Base));
6178c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6183454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
6184ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // Can never occur in a dependent context.
61851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6190454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
6191f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
6192f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6193f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6194f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6195c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6196f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6197f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6198f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6199f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6200c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6201f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  return getDerived().RebuildObjCIsaExpr(move(Base), E->getIsaMemberLoc(),
6202f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                         E->isArrow());
6203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6207454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
6208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
6210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
6211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
6212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
6213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
62141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
6216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
6217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
62181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
62211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
62221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
6224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
6225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
6226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6230454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
6231a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  SourceLocation CaretLoc(E->getExprLoc());
6232a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6233a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  SemaRef.ActOnBlockStart(CaretLoc, /*Scope=*/0);
6234a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  BlockScopeInfo *CurBlock = SemaRef.getCurBlock();
6235a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  CurBlock->TheDecl->setIsVariadic(E->getBlockDecl()->isVariadic());
6236a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  llvm::SmallVector<ParmVarDecl*, 4> Params;
6237a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  llvm::SmallVector<QualType, 4> ParamTypes;
6238a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6239a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Parameter substitution.
6240a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  const BlockDecl *BD = E->getBlockDecl();
6241a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  for (BlockDecl::param_const_iterator P = BD->param_begin(),
6242a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian       EN = BD->param_end(); P != EN; ++P) {
6243a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParmVarDecl *OldParm = (*P);
6244a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParmVarDecl *NewParm = getDerived().TransformFunctionTypeParam(OldParm);
6245a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    QualType NewType = NewParm->getType();
6246a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    Params.push_back(NewParm);
6247a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParamTypes.push_back(NewParm->getType());
6248a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6249a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6250a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  const FunctionType *BExprFunctionType = E->getFunctionType();
6251a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  QualType BExprResultType = BExprFunctionType->getResultType();
6252a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!BExprResultType.isNull()) {
6253a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    if (!BExprResultType->isDependentType())
6254a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      CurBlock->ReturnType = BExprResultType;
6255a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    else if (BExprResultType != SemaRef.Context.DependentTy)
6256a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      CurBlock->ReturnType = getDerived().TransformType(BExprResultType);
6257a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6258a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6259a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Transform the body
6260a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  OwningStmtResult Body = getDerived().TransformStmt(E->getBody());
6261a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (Body.isInvalid())
6262a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.ExprError();
6263a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Set the parameters on the block decl.
6264a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!Params.empty())
6265a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    CurBlock->TheDecl->setParams(Params.data(), Params.size());
6266a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6267a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  QualType FunctionType = getDerived().RebuildFunctionProtoType(
6268a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        CurBlock->ReturnType,
6269a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        ParamTypes.data(),
6270a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        ParamTypes.size(),
6271a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        BD->isVariadic(),
6272fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                        0,
6273fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                               BExprFunctionType->getExtInfo());
6274a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6275a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  CurBlock->FunctionType = FunctionType;
6276a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  return SemaRef.ActOnBlockStmtExpr(CaretLoc, move(Body), /*Scope=*/0);
6277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6281454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
6282a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  NestedNameSpecifier *Qualifier = 0;
6283a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6284a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  ValueDecl *ND
6285a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
6286a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                       E->getDecl()));
6287a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!ND)
6288a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.ExprError();
62892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
6290a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!getDerived().AlwaysRebuild() &&
6291a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      ND == E->getDecl()) {
6292a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // Mark it referenced in the new context regardless.
6293a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // FIXME: this is a bit instantiation-specific.
6294a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
6295a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6296a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.Owned(E->Retain());
6297a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6298a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
62992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation());
6300a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  return getDerived().RebuildDeclRefExpr(Qualifier, SourceLocation(),
63012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, 0);
6302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
63031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
6306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
630985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
631085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
63112865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildPointerType(PointeeType, Star,
6312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
6313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
631685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
631785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
63182865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Star,
6319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
6320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
63231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
632485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
632585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
632685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
63272865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
632885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
6329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
63321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
633385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
633485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
633585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
63362865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
633785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
6338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
6342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
6343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
6344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
6345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
6346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
6347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
6348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
6349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
6350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
6351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
63521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
63541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
63551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
63561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
6357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
6358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
6359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
6360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
6361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
6362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
6363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
6364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
63651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
63671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
6368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
63691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
6370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
6375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
6376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
637785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
637885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
63791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
638085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
6381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
6386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
638785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
638885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
63891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
639085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
6391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
6396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
6397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
6398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
6399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
64001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
6402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
64061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
64071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
6408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
6409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
6410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
6411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
64121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
6414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
6419788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                     unsigned NumElements,
6420788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                     VectorType::AltiVecSpecific AltiVecSpec) {
6421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
6422788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  return SemaRef.Context.getVectorType(ElementType, NumElements, AltiVecSpec);
6423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
6427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
6428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
6429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
6430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
6431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
64321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
6433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
6434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
6435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
6436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
64391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
64401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
6441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
6442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
6443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
6444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
64481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
6449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
64501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
6451fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                          unsigned Quals,
6452fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                            const FunctionType::ExtInfo &Info) {
64531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
6454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
6455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
6456fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   getDerived().getBaseEntity(),
6457fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   Info);
6458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6461a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
6462a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
6463a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
6464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
6465a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
6466ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
6467ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
6468ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
6469ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
647092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // FIXME: Doesn't account for ObjCInterfaceDecl!
6471ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
6472ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
6473ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
6474ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
6475ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
6476ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6477ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
6478ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
6479ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
6480c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6481ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
6482ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
6483ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
6484ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
6485ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
6486ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6487ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
6488ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
6489ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6490ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
6491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
6492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
6493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
6497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
6498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
6502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
6503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
6507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
6508833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
6509d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
6510d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
6511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
65121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6513dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6516dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6517a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
6518c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
6519d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
6520dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
6521dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
6522dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
6523dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
6524dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
65251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
6526495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
6527c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
6528c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
652946646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
6530dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6533dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6534dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6535dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6536dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
6537dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
6538dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6539dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6540dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6541dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6542dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6543dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6544dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
6545edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   QualType T) {
6546edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor  if (T->isDependentType() || T->isRecordType() ||
6547dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
6548a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6549dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
6550dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
6551dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
65521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6553dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
6554dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
6555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
65561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6557d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
65581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6559d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6560d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
6561d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
65621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
6563d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
6564d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
6565d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
6566d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
65671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6568d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
65693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
65703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
6571d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
6572d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
65731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
6574014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
6575014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
6576d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
6577d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6578d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6579d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
6580d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
6581d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       ObjectType.getAsOpaquePtr(),
6582d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
6583d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
6584d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
6585d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
65861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6588ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
6589ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6590ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
6591ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
6592ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
6593ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6594ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
6595ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
6596ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
6597ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
6598ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
6599d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
6600d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6601ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6602d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
6603d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
6604d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       ObjectType.getAsOpaquePtr(),
6605d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
6606d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
6607d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
6608ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
6609c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6610ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
66111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
6613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
6614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
6615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
6616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
6617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
6618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
6619ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
6620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
66211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
6623f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
6624f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    if (!FirstExpr->getType()->isOverloadableType() &&
6625f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl        !SecondExpr->getType()->isOverloadableType())
6626f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
6627ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                 CalleeExpr->getLocStart(),
6628f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       move(Second), OpLoc);
66291a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
66301a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
66311a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
6632f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  } else if (SecondExpr == 0 || isPostIncDec) {
6633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
6634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
6635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
66361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
6637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
66381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
6640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
66421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
6643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
6644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
6645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
6646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
66471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
6648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
6649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
6650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
66511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
6653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
6654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
6655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
6659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
66606e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
66611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6662ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
6663ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
6664ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
6665ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
6666ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
66676e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
6668ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
66696e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.addDecl(cast<DeclRefExpr>(CalleeExpr)->getDecl());
6670ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
66711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
6673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
6674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
66751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
6677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
66781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
6679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
6680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
6681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6683f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
6684ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
6685ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
6686ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(First),
6687ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(Second));
6688f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
6689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
66901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
6691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
66921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
6693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
6694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
6695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
66961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
6698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
66991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
6700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
67011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
670226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
6703c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntSema::OwningExprResult
670426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(ExprArg Base,
670526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
670626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
670726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                 NestedNameSpecifier *Qualifier,
670826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceRange QualifierRange,
670926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
671026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
6711fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
6712a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
671326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  CXXScopeSpec SS;
671426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (Qualifier) {
671526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setRange(QualifierRange);
671626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setScopeRep(Qualifier);
671726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
671826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
671926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  Expr *BaseE = (Expr *)Base.get();
672026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  QualType BaseType = BaseE->getType();
6721a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (BaseE->isTypeDependent() || Destroyed.getIdentifier() ||
672226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
6723c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      (isArrow && BaseType->getAs<PointerType>() &&
6724bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
6725bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
672626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
672726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    return SemaRef.BuildPseudoDestructorExpr(move(Base), OperatorLoc,
672826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
6729fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
6730a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
673126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
673226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
67332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
6734a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
67352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
67362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                 SemaRef.Context.getCanonicalType(DestroyedType->getType())));
67372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
67382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  NameInfo.setNamedTypeInfo(DestroyedType);
67392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
674026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
67412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
674226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
674326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
674426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
67452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            NameInfo,
674626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
674726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
674826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
6749577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
6750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6751577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
6752