TreeTransform.h revision ad00b7705f9bbee81beeac428e7c6587734ab5a6
1a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall//===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===/
2577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
3577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//                     The LLVM Compiler Infrastructure
4577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
5577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file is distributed under the University of Illinois Open Source
6577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// License. See LICENSE.TXT for details.
7577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
8577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
9577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  This file implements a semantic tree transformation that takes a given
10577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  AST and rebuilds it, possibly transforming some nodes in the process.
11577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
12577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
13577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H
15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "Sema.h"
17f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall#include "Lookup.h"
18dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
19c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
20657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
22b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
26a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h"
27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h"
28b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h"
29b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
30a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h"
31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
64670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
7143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningStmtResult OwningStmtResult;
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningExprResult OwningExprResult;
94b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::StmtArg StmtArg;
95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::ExprArg ExprArg;
96b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
9743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  typedef Sema::MultiStmtArg MultiStmtArg;
9899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  typedef Sema::DeclPtrTy DeclPtrTy;
99c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, returns no source-location information. Subclasses can
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  DeclarationName Entity) : Self(Self) {
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determine whether the given type \p T has already been
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// to short-circuit evaluation when it is known that a given type will
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// \brief Determine whether the given call argument should be dropped, e.g.,
1766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// because it is a default argument.
1776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  ///
1786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// Subclasses can provide an alternative implementation of this routine to
1796eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// determine which kinds of call arguments get dropped. By default,
1806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// CXXDefaultArgument nodes are dropped (prior to transformation).
1816eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  bool DropCallArgument(Expr *E) {
1826eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    return E->isDefaultArgument();
1836eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  }
184c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by creating a
188a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// TypeSourceInfo for it and delegating to the appropriate
189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// function.  This is expensive, but we don't mind, because
190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// this method is deprecated anyway;  all users should be
191a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// switched to storing TypeSourceInfos.
192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
194124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType TransformType(QualType T, QualType ObjectType = QualType());
1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transforms the given type-with-location into a new
197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type-with-location.
198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ///
199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by delegating to the
200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// appropriate TransformXXXType to build a new type.  Subclasses
201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// may override this function (to take over all type
202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// transformations) or some set of the TransformXXXType functions
203a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// to alter the transformation.
204c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  TypeSourceInfo *TransformType(TypeSourceInfo *DI,
205124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                QualType ObjectType = QualType());
206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
211c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL,
212124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                         QualType ObjectType = QualType());
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
214657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
21743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
21843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
21943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
22043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
22143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
22243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
225657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
226657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
233454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult TransformExpr(Expr *E);
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
239dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
2407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
24243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
24543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
246c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
247c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().TransformDecl(Loc, D);
2487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  }
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
253c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// This specific declaration transformation only applies to the first
2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
259c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
260c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
2616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
262c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
266dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
267dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
269a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
270c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
271c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
27681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
27781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
27881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
27981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName TransformDeclarationName(DeclarationName Name,
280dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           SourceLocation Loc,
281dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                           QualType ObjectType = QualType());
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
285d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
287d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
295670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
296670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
306a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// \brief Fakes up a TypeSourceInfo for a type.
307a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
308a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return SemaRef.Context.getTrivialTypeSourceInfo(T,
309833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
310833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
314124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T, \
315124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType = QualType());
316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms the parameters of a function type into the
31921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// given vectors.
32021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// The result vectors should be kept in sync; null entries in the
32221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// variables vector are acceptable.
32321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// Return true on error.
32521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
32621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<QualType> &PTypes,
32721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<ParmVarDecl*> &PVars);
32821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
32921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms a single function-type parameter.  Return null
33021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// on error.
33121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm);
33221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
333c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL,
334124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType);
33585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
336c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType
337dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
338dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
34043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
341d8383d45e41ba2316610e5d638d2872e37b67cfbZhongxing Xu  OwningExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
34443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
346454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult Transform##Node(Node *E);
3477381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
3484bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
36085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
37085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
37185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
37285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
37985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
38085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
40485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
40585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
41485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
41585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
44482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
44582287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    bool IsAltiVec, bool IsPixel);
4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
476ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// \brief Rebuild an unresolved typename type, given the decl that
477ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// the UnresolvedUsingTypenameDecl was transformed to.
478ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType RebuildUnresolvedUsingType(Decl *D);
479ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4947da2431c23ef1ee8acb114e39692246e1801afc2John McCall
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
54733500955d731c73717af52088b7fc0e7a85681e7John McCall    // If it's still dependent, make a dependent specialization.
54833500955d731c73717af52088b7fc0e7a85681e7John McCall    if (InstName.getAsDependentTemplateName())
54933500955d731c73717af52088b7fc0e7a85681e7John McCall      return SemaRef.Context.getDependentTemplateSpecializationType(
55033500955d731c73717af52088b7fc0e7a85681e7John McCall                                          Keyword, NNS, Name, Args);
55133500955d731c73717af52088b7fc0e7a85681e7John McCall
55233500955d731c73717af52088b7fc0e7a85681e7John McCall    // Otherwise, make an elaborated type wrapping a non-dependent
55333500955d731c73717af52088b7fc0e7a85681e7John McCall    // specialization.
55433500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType T =
55533500955d731c73717af52088b7fc0e7a85681e7John McCall      getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
55633500955d731c73717af52088b7fc0e7a85681e7John McCall    if (T.isNull()) return QualType();
557465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
558465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
5591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
564e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// (or elaborated type). Subclasses may override this routine to provide
565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
566e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
5674a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    NestedNameSpecifier *NNS,
5684a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    const IdentifierInfo *Id,
569e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation KeywordLoc,
570e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceRange NNSRange,
571e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation IdLoc) {
5724033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    CXXScopeSpec SS;
5734033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SS.setScopeRep(NNS);
574e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    SS.setRange(NNSRange);
575e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara
5764033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (NNS->isDependent()) {
5774033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      // If the name is still dependent, just build a new dependent name type.
5784033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
5794033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return SemaRef.Context.getDependentNameType(Keyword, NNS, Id);
5804033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
5814033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
582465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (Keyword == ETK_None || Keyword == ETK_Typename)
583e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return SemaRef.CheckTypenameType(Keyword, NNS, *Id,
584e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                       KeywordLoc, NNSRange, IdLoc);
585465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
586465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
587465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
588e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    // We had a dependent elaborated-type-specifier that has been transformed
5894033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // into a non-dependent elaborated-type-specifier. Find the tag we're
5904033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // referring to.
591e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
5924033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
5934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!DC)
5944033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
5954033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
5965613876991c80a684595fe8de1f039296a0657ffJohn McCall    if (SemaRef.RequireCompleteDeclContext(SS, DC))
5975613876991c80a684595fe8de1f039296a0657ffJohn McCall      return QualType();
5985613876991c80a684595fe8de1f039296a0657ffJohn McCall
5994033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    TagDecl *Tag = 0;
6004033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SemaRef.LookupQualifiedName(Result, DC);
6014033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    switch (Result.getResultKind()) {
6024033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFound:
6034033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFoundInCurrentInstantiation:
6044033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
605c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6064033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Found:
6074033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        Tag = Result.getAsSingle<TagDecl>();
6084033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
609c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6104033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundOverloaded:
6114033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundUnresolvedValue:
6124033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        llvm_unreachable("Tag lookup cannot find non-tags");
6134033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
614c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6154033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Ambiguous:
6164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        // Let the LookupResult structure handle ambiguities.
6174033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
6184033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6194033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6204033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!Tag) {
6211eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor      // FIXME: Would be nice to highlight just the source range.
622e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
6231eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor        << Kind << Id << DC;
6244033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6254033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
626465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
627e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) {
628e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
6294033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
6304033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6314033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6324033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6334033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // Build the elaborated-type-specifier type.
6344033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    QualType T = SemaRef.Context.getTypeDeclType(Tag);
635465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
636dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
638dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
639dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
640dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
641dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
642dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
643dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
644dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
645dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
646a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
647c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
648c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
649dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
650dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
651dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
652dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
653dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
654dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
655dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
656dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
657dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
658dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
659dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
660dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
661dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
662dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
663dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
664dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
665dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
666dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
667dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
668dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
669edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  QualType T);
670d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
671d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
672d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
673d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
674d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
675d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
676d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
677d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
678d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
679d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
680d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
681d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
682d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
683d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
684d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
685d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
686d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
687d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
688d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
6893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
6903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
6911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
692ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
693ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
694ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
695ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
696ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
697ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
698ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
699ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
700ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
701ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
702c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
7441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
763eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
764c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                 VarDecl *CondVar, StmtArg Then,
76599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 SourceLocation ElseLoc, StmtArg Else) {
766eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return getSema().ActOnIfStmt(IfLoc, Cond, DeclPtrTy::make(CondVar),
76799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                 move(Then), ElseLoc, move(Else));
76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
774586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
775586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          Sema::ExprArg Cond,
77699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                          VarDecl *CondVar) {
777586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, move(Cond),
778586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                            DeclPtrTy::make(CondVar));
77943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
78843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
796eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                    Sema::FullExprArg Cond,
79799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
79843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
799eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond,
800586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                    DeclPtrTy::make(CondVar), move(Body));
80143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
81143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
8121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
81343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
81443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
81543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
81643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
81743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
81843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
81943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
82143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
822eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                  StmtArg Init, Sema::FullExprArg Cond,
82399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
82443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
825eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), Cond,
82699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  DeclPtrTy::make(CondVar),
82799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  Inc, RParenLoc, move(Body));
82843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
83143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
83243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
83343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
83443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
83643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
83743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
83943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
84043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
84143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
84243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
84343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
84443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
84543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
84643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
84743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
84843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
85143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
85243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
85343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
85443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
85543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
8561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
85843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
86143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
86243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
86343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
86443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
86643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
86743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
86843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
86943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
87043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
87143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
87243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
874703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
875703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
876703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
877703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc,
879703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
880703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
882703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
883ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
884703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
885703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
886703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  ExprArg AsmString,
887703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
889703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
890c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
891703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
892703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  move(Exprs), move(AsmString), move(Clobbers),
893703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
894703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
8954dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
8964dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @try statement.
8974dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
8984dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
8994dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9004dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
9014dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        StmtArg TryBody,
9028f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                        MultiStmtArg CatchStmts,
9034dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        StmtArg Finally) {
9048f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    return getSema().ActOnObjCAtTryStmt(AtLoc, move(TryBody), move(CatchStmts),
9054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                        move(Finally));
9064dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
9074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
908be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Rebuild an Objective-C exception declaration.
909be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
910be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new declaration.
911be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
912be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
913be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                    TypeSourceInfo *TInfo, QualType T) {
914c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildObjCExceptionDecl(TInfo, T,
915c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                            ExceptionDecl->getIdentifier(),
916be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                            ExceptionDecl->getLocation());
917be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
918c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
919be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Build a new Objective-C @catch statement.
920be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
921be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
922be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
923be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  OwningStmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
924be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          SourceLocation RParenLoc,
925be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          VarDecl *Var,
926be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          StmtArg Body) {
927be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
928be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          Sema::DeclPtrTy::make(Var),
929be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          move(Body));
930be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
931c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @finally statement.
9334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
9344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9354dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9364dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
9374dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                            StmtArg Body) {
9384dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return getSema().ActOnObjCAtFinallyStmt(AtLoc, move(Body));
9394dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
940c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9418fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @throw statement.
942d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  ///
943d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
944d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
945d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  OwningStmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
946d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor                                          ExprArg Operand) {
947d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    return getSema().BuildObjCAtThrowStmt(AtLoc, move(Operand));
948d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
949c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9508fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @synchronized statement.
9518fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  ///
9528fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
9538fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9548fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningStmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
9558fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 ExprArg Object,
9568fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 StmtArg Body) {
9578fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, move(Object),
9588fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                 move(Body));
9598fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  }
960c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor
961c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// \brief Build a new Objective-C fast enumeration statement.
962c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  ///
963c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
964c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
965c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
966c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation LParenLoc,
967c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                StmtArg Element,
968c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                ExprArg Collection,
969c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation RParenLoc,
970c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                StmtArg Body) {
971c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
972c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                move(Element),
973c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                move(Collection),
974c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                RParenLoc,
975c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                move(Body));
976c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  }
977c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
97843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
97943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
98043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
98143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
983a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
98443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
98543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
98643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
9871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
98843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
98943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
99043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
99143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
99243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
99343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
99443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
99543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
99643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
99743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
99843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
9991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
100043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
100143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
100443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
100543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
100843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
100943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
101043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
101143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1017f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1018f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              LookupResult &R,
1019f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              bool RequiresADL) {
1020f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1021f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
1022f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1023f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1024f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
1025f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
1026f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
1027f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
1028a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
1029a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
1030dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      ValueDecl *VD, SourceLocation Loc,
1031dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      TemplateArgumentListInfo *TemplateArgs) {
1032a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
1033a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
1034a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
1035dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
1036dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
1037c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1038dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return getSema().BuildDeclarationNameExpr(SS, Loc, VD);
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1050a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
10511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1052a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1053a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1054a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
1055a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
1056a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
1057a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                NestedNameSpecifier *Qualifier,
105826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceRange QualifierRange,
105926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  TypeSourceInfo *ScopeType,
106026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceLocation CCLoc,
1061fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                  SourceLocation TildeLoc,
1062a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
10631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
10651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
10716ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, move(SubExpr));
1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Build a new builtin offsetof expression.
10758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ///
10768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
10778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OwningExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
10798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       TypeSourceInfo *Type,
10808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       Action::OffsetOfComponent *Components,
10818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       unsigned NumComponents,
10828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       SourceLocation RParenLoc) {
10838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
10848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          NumComponents, RParenLoc);
10858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1086c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
10881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1091a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
10925ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
1094a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
11091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
11151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
11281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
11401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
11441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
114583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
114683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
114783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
1148f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                                     ValueDecl *Member,
11496bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                     NamedDecl *FoundDecl,
1150d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
11518a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
1152d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
1153d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
1154d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115683a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor      Expr *BaseExpr = Base.takeAs<Expr>();
11576bb8017bb9e828d118e15e59d71c66bba323c364John McCall      if (getSema().PerformObjectMemberConversion(BaseExpr, Qualifier,
11586bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                                  FoundDecl, Member))
115983a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        return getSema().ExprError();
11608aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
116283a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        new (getSema().Context) MemberExpr(BaseExpr, isArrow,
1163d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
1164d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
1165d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
1166d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
11671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
116983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
117083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
117183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
117283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
117383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
1174aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
1175aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
11766bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // FIXME: this involves duplicating earlier analysis in a lot of
11776bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // cases; we should avoid this when possible.
1178c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    LookupResult R(getSema(), Member->getDeclName(), MemberLoc,
1179c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                   Sema::LookupMemberName);
11806bb8017bb9e828d118e15e59d71c66bba323c364John McCall    R.addDecl(FoundDecl);
1181c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1182c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
1183aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1184aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                              OpLoc, isArrow,
1185129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1186c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
11901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
1196c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc,
11976ca7cfb3fbe4dc92e457fd303814d274176cf359Douglas Gregor                                LHS.takeAs<Expr>(), RHS.takeAs<Expr>());
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
12011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
12091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
12189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
1221b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1222b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall                                         move(SubExpr));
1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
12261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
123042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
123342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
123442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              move(Init));
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
12381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1245aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1246129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
1247aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    QualType BaseType = ((Expr*) Base.get())->getType();
1248aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
1249129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1250129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
12512d1c21414199a7452f122598189363a3922605b1Douglas Gregor                                              DeclarationName(&Accessor),
1252129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              AccessorLoc,
1253129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
12571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1262e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1263e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
1264e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    OwningExprResult Result
1265e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1266e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1267e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1268c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1269e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1270e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1271e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1272e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1273e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
12771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
12901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
12961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
13051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
13101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
13151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1321c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1322f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
13271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
13371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
13761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
13841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
13891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
13949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
14019d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
14069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
14071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
14091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
14119d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
14121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
14151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
14179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
14181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
14201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
14251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
14359d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1440c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
1441c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1442c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1443c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
14529d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1457c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1458c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1459c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1460c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
14699d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1474c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1475c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1476c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1477c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
14869d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1491c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
1492c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       TInfo, move(SubExpr),
1493c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1494c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
15029d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                TypeSourceInfo *TInfo,
1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
150688650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
15089d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                               TInfo->getType().getAsOpaquePtr(),
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
151088650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
15111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
151957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
152057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
152157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        TypeSourceInfo *Operand,
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1523c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
152457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
153157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
153257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
1533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
153557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, move(Operand),
153657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
15371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
15441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1545828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1546828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1548828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1549828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1565c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1566036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1567036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1568036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
15791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
15801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
15941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
16021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
16411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1646865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1650f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1654f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1655f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
1656f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return getSema().BuildQualifiedTemplateIdExpr(SS, Name, Location,
1657f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildQualifiedDeclarationNameExpr(SS, Name, Location);
1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1666f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1667f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1668f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1669d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1670f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
16784411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
16824411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef);
1683c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
16844411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
16854411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor      return getSema().ExprError();
1686c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
16874411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
16884411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           move_arg(ConvertedArgs));
1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1732865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(ExprArg BaseE,
1733aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1736a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1737a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1738129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
1739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1740c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1741129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1743a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1744a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1746aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1747aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1748129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
1749129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            Name, MemberLoc, TemplateArgs);
1750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1752129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
17533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
17543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
17553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1756129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  OwningExprResult RebuildUnresolvedMemberExpr(ExprArg BaseE,
1757aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1758129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1759129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1760129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1761129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1762c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1763129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1764129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
17653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
17663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
17673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
17681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1769aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    return SemaRef.BuildMemberReferenceExpr(move(BaseE), BaseType,
1770aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1771c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1772c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
17733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
17741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
178081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                         TypeSourceInfo *EncodeTypeInfo,
1781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
178281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
1783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
17841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
178692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C class message.
178792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
178892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
178992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1790c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
179192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
179292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
179392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
179492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     ReceiverTypeInfo->getType(),
179592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     /*SuperLoc=*/SourceLocation(),
1796f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                     Sel, Method, LBracLoc, RBracLoc,
179792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     move(Args));
179892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
179992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
180092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C instance message.
180192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult RebuildObjCMessageExpr(ExprArg Receiver,
180292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
180392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1804c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
180592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
180692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
180792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    QualType ReceiverType = static_cast<Expr *>(Receiver.get())->getType();
180892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildInstanceMessage(move(Receiver),
180992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        ReceiverType,
181092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        /*SuperLoc=*/SourceLocation(),
1811f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                        Sel, Method, LBracLoc, RBracLoc,
181292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        move(Args));
181392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
181492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
1815f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C ivar reference expression.
1816f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1817f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1818f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1819f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult RebuildObjCIvarRefExpr(ExprArg BaseArg, ObjCIvarDecl *Ivar,
1820f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          SourceLocation IvarLoc,
1821f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          bool IsArrow, bool IsFreeIvar) {
1822f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    // FIXME: We lose track of the IsFreeIvar bit.
1823f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
1824f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1825f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
1826f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
1827f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1828f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IvarLoc,
1829ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         SS, DeclPtrTy(),
1830ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
1831f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1832f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1833c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1834f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1835f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1836c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1837c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1838f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              Base->getType(),
1839c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IvarLoc, IsArrow, SS,
1840f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1841c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1842f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1843f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1844e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor
1845e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// \brief Build a new Objective-C property reference expression.
1846e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  ///
1847e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1848e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1849c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  OwningExprResult RebuildObjCPropertyRefExpr(ExprArg BaseArg,
1850e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              ObjCPropertyDecl *Property,
1851e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              SourceLocation PropertyLoc) {
1852e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    CXXScopeSpec SS;
1853e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1854e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
1855e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                   Sema::LookupMemberName);
1856e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    bool IsArrow = false;
1857e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1858e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         /*FIME:*/PropertyLoc,
1859ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         SS, DeclPtrTy(),
1860ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
1861e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.isInvalid())
1862e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return getSema().ExprError();
1863c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1864e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.get())
1865e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return move(Result);
1866c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1867c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1868e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              Base->getType(),
1869c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/PropertyLoc, IsArrow,
1870c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              SS,
1871e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*FirstQualifierInScope=*/0,
1872c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1873e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*TemplateArgs=*/0);
1874e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  }
1875c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1876c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// \brief Build a new Objective-C implicit setter/getter reference
18779cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// expression.
18789cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  ///
18799cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1880c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// Subclasses may override this routine to provide different behavior.
18819cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  OwningExprResult RebuildObjCImplicitSetterGetterRefExpr(
18829cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Getter,
18839cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          QualType T,
18849cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Setter,
18859cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        SourceLocation NameLoc,
18869cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          ExprArg Base) {
18879cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // Since these expressions can only be value-dependent, we do not need to
18889cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // perform semantic analysis again.
18899cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return getSema().Owned(
18909cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
18919cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     Setter,
18929cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     NameLoc,
18939cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          Base.takeAs<Expr>()));
18949cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  }
18959cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor
1896f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C "isa" expression.
1897f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1898f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1899f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1900f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult RebuildObjCIsaExpr(ExprArg BaseArg, SourceLocation IsaLoc,
1901f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                      bool IsArrow) {
1902f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
1903f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    Expr *Base = BaseArg.takeAs<Expr>();
1904f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
1905f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
1906f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1907f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IsaLoc,
1908ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         SS, DeclPtrTy(),
1909ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
1910f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1911f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1912c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1913f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1914f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1915c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1916c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildMemberReferenceExpr(getSema().Owned(Base),
1917f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              Base->getType(),
1918c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IsaLoc, IsArrow, SS,
1919f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1920c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1921f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1922f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1923c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
19321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
19371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
19401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
19420da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
19531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
19581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
19601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
196443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
196543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
196643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
196743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
19681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
197043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
19711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
197243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
197343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
197443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
197543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
19764bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
197843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
197943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
19807381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
198143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
19824bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
198343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
198443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
198543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
198643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
19871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19885ee56e95c3905d2e7bc403631b03865cdbdd8a42Anders Carlsson      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E));
198943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
19901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
19911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
199343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
19941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1996670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1997454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
1998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
2000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
2002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
2003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
20047381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
2005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
2006454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
20074bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
20081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
20091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2011657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
2012657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
2013657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
2014dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
2015dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
2016a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
2017c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
2018c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
20190979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
20200979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
20211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
202243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
2023dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
2024dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
20251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
2026c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
2027c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
2028dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
2029dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
20301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
2032c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
2033a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
2034c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
2035dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2037dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
2038dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
2040a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
2041a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
2042a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
2043dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2046a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
2047c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
2048c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2050dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
20511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
2052dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
20537c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
20547c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       NNS->getAsNamespace()));
20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
2056dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2057dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
2058dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2060dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2061dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2063dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
2064dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
2065dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
2066dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
20671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2068dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
2069dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
2070fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2071124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
2072124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
2073d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
2074d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
20751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2076dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
2077dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2078dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
2079dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
20821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2083edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   T);
2084dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
2085dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2087dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
20881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
2089dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
2090dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
2091dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
20921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
209381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
2094dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 SourceLocation Loc,
2095dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                                 QualType ObjectType) {
209681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
209781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
209881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
209981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
210081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
210181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
210281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
210381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
210481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
21053e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
210681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
210781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
21081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
210981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
211081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
211181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
211281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
2113c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    QualType T = getDerived().TransformType(Name.getCXXNameType(),
2114124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
211581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
211681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
21171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
211881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
21191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
212081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
212181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
21221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
21231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
212481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
212581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
212681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
212781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
21281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
21293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
21303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
21317c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  SourceLocation Loc = getDerived().getBaseLocation();
21327c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor
2133d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
21341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2135d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
2136124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2137124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
2138d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
2139d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2141d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
21421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
21437c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2144d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
2145d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
21461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2147d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
2148d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
2149d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
2150d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
21511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2152d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
2153d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
2154d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
21551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2156f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
2157f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
2158d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2160d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2162d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
2163124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2164124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
21653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
2166d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2168d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2169dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
2170dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
2171d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2173ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
2174c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
2175ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
2176c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2177c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
2178ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
2179d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2181d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
21821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
21837c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2184d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
2185d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2187d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2188d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
2189d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2191d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
2192d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2194f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
2195f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
2196f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
2197d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
2198d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
2199d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
2200833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
2201833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
2202833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2203833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
2204670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
2205670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
22069f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
2207833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2208833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
2210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
2211a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2212c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2213833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2214833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2215788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
2216788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
2217788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
2218c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
2220833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2221833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2223833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
2224670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
2225833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
2226828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2227833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2232833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
2233833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
2234833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2235833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
2236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
2237833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
2238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
2239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
2240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
22411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2242670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
2243a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2244833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
2245a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2246833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
2248833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
2249833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2250833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2251833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2252670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2254670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
2255833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
2256972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
2257972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2258972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
2259788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
22607c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2261833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
2262833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2263828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
2264828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
2265828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
2266828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
2267828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
2268828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (E.isInvalid())
2269828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = NULL;
2270828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      else {
2271828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr = E.takeAs<Expr>();
2272828bff2079b6a91ecd7ed5b842c59527d7682789John McCall        SourceExpr->Retain();
2273828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      }
2274828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
2275828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2276828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2277833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2278670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2280788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
2281c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
2282788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
2283788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
2284788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
2285788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
2286c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2287788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
2288788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
2289788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
2290788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
2291788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
2292c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2293670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
2294670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
22951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
2296670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
22971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
2299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
2302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
2304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *ETaken = E.takeAs<Expr>();
2306828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    ETaken->Retain();
2307833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2308833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2309670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2311670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2312670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2313670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
23141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2315670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2316670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
23171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2318833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2321828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2322828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2323828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2324828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2325833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2326833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2327828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2328670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2329670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
23301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2331670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2332828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2333833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2334670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2335670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2337670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2338833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2339670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2340670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2346c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntQualType TreeTransform<Derived>::TransformType(QualType T,
2347124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
23501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2353a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
23544802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2355c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2356124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
23571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
23601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2365124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2366124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2367a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
23691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
23711bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
23741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2375124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
23781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2379a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2384124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2385124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2390124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2391124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
23959f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
24041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2407124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualifiedTypeLoc T,
2408124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2409a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2411124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2412124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
24211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24222865474261a608c7873b87ba4af110d17907896dJohn McCall  if (!Quals.empty()) {
24232865474261a608c7873b87ba4af110d17907896dJohn McCall    Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
24242865474261a608c7873b87ba4af110d17907896dJohn McCall    TLB.push<QualifiedTypeLoc>(Result);
24252865474261a608c7873b87ba4af110d17907896dJohn McCall    // No location information to preserve.
24262865474261a608c7873b87ba4af110d17907896dJohn McCall  }
2427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2440124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      BuiltinTypeLoc T,
2441124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2442ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2443ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
2444ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
2445ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2446ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
2447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2451124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      ComplexTypeLoc T,
2452124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
24561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2457a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2459c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                      PointerTypeLoc TL,
2460124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2461c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType PointeeType
2462c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
246392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType.isNull())
246492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return QualType();
246592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
246692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  QualType Result = TL.getType();
2467c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (PointeeType->getAs<ObjCObjectType>()) {
246892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // A dependent pointer type 'T *' has is being transformed such
246992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // that an Objective-C class type is being replaced for 'T'. The
247092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // resulting pointer type is an ObjCObjectPointerType, not a
247192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // PointerType.
2472c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
2473c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2474c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
2475c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    NewT.setStarLoc(TL.getStarLoc());
247692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Result;
247792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2478c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
247992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (getDerived().AlwaysRebuild() ||
248092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      PointeeType != TL.getPointeeLoc().getType()) {
248192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
248292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Result.isNull())
248392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return QualType();
248492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
248692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
248792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2488c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Result;
2489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2494124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  BlockPointerTypeLoc TL,
2495124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  QualType ObjectType) {
2496db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  QualType PointeeType
2497c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2498c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (PointeeType.isNull())
2499c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return QualType();
2500c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2501c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType Result = TL.getType();
2502c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (getDerived().AlwaysRebuild() ||
2503c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      PointeeType != TL.getPointeeLoc().getType()) {
2504c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildBlockPointerType(PointeeType,
2505db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor                                                  TL.getSigilLoc());
2506db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor    if (Result.isNull())
2507db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor      return QualType();
2508db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  }
2509db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor
251039968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
2511db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2512db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  return Result;
2513a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
251585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
251685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
251785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
251885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
251985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
252085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
252185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2522124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ReferenceTypeLoc TL,
2523124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
252485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
252585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
252685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
252785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
252885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
252985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
253085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
253185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
253285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
253385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
253485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
253585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
253685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
253785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
253885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
253985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
254085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
254185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
254285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
254385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
254485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
254585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
254685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
254785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
254885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
254985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
255085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
255185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2555124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 LValueReferenceTypeLoc TL,
2556124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2557124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2563124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 RValueReferenceTypeLoc TL,
2564124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2565124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
25691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2571124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   MemberPointerTypeLoc TL,
2572124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
258985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
259085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2591a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
26011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
26021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2604124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ConstantArrayTypeLoc TL,
2605124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2611a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
261785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
261885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2622c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2623a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
26261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2640124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              IncompleteArrayTypeLoc TL,
2641124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              QualType ObjectType) {
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2647a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
265285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
265385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2657c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2658a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2669124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   VariableArrayTypeLoc TL,
2670124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2676670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2677670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2678670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2679a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   move(SizeResult),
2693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
269485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2697577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2698a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
2699c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
27041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2710a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2711124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                             DependentSizedArrayTypeLoc TL,
2712124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2718670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2719670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
27201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
2734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         move(SizeResult),
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
273685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2739577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
27411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2753577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2755124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      DependentSizedExtVectorTypeLoc TL,
2756124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2760577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2761577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2762577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2764670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2765670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2766670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2767577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2769577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2773eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2774eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
2776577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2777577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else Size.take();
2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2789a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2794577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2797a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2798124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     VectorTypeLoc TL,
2799124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2800a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2801577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2802577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2803577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2804577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2805a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2807a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
280882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
280982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson      T->isAltiVec(), T->isPixel());
2810a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2811a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2812a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2813c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2814a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2815a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2817a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2818577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2821a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2822124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        ExtVectorTypeLoc TL,
2823124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2824a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2827577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2829a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2830a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2831a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2833a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2835a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2836a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2837a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2838c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2839a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2840a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2842a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2843577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
284621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
284721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
284821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
284921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
285021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
285121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
285221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
285321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
285421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
285521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
285621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
285721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
285821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
285921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
286021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
286121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
286221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
286316573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                               OldParm->getStorageClassAsWritten(),
286421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
286521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
286621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
286721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
286821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
286921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
287021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<QualType> &PTypes,
287121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
28731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2874a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2878a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2879a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2880a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
288121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
288221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
288321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2884a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2885a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2886a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
289421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
28961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
289721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PTypes.push_back(NewType);
289821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PVars.push_back(NewParm);
2899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
29001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
290121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
290221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
290321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
290421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
290521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
290621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
290721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   FunctionProtoTypeLoc TL,
290821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   QualType ObjectType) {
2909895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // Transform the parameters. We do this first for the benefit of template
2910895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiations, so that the ParmVarDecls get/ placed into the template
2911895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiation scope before we transform the function type.
291221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
291321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
291421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
291521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return QualType();
2916c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2917895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  FunctionProtoType *T = TL.getTypePtr();
2918895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2919895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  if (ResultType.isNull())
2920895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor    return QualType();
2921c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2922a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2923a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2924a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2925a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2926a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2929a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2930a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getTypeQuals());
2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2933a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
29341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2939a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2945577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2947124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 FunctionNoProtoTypeLoc TL,
2948124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 QualType ObjectType) {
2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2952a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2954a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2955a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2956a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2957a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2959a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2960a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2961a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2962a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2966ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2967ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2968124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 UnresolvedUsingTypeLoc TL,
2969124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2970ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
29717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2972ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
2973ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
2974ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2975ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
2976ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2977ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
2978ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
2979ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
2980ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
2981ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2982ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
2983ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
2984ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2985ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
2986ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2987ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
2988ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
2989ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2990577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2992124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypedefTypeLoc TL,
2993124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2994a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
29967c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
29977c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
2998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3001a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3002a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3003a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
3004a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
3005a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3007a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3008a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
3010a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3016a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
3017124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypeOfExprTypeLoc TL,
3018124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3019670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
3020670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3022cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3028cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
3029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypeOfExprType(move(E));
3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3031a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
30341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3035a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3036cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3037cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3038cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3041577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
3045124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     TypeOfTypeLoc TL,
3046124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3047cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3048cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3049cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
3050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3053cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3054cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
30581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3059a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3060cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3061cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3062cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3063cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
3064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
3070124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       DecltypeTypeLoc TL,
3071124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
3073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3074670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
3075670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
3078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3083a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
3084a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDecltypeType(move(E));
3085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
3089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
3091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3094577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3095577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3096577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
3098124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     RecordTypeLoc TL,
3099124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
3101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
31027c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31037c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
3104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
3105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
3110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
3111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
31141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
3116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
3123124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   EnumTypeLoc TL,
3124124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
3126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
31277c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31287c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
3129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
3130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
3135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
3136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
3141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31457da2431c23ef1ee8acb114e39692246e1801afc2John McCall
31463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
31473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
31483cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
31493cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         InjectedClassNameTypeLoc TL,
31503cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         QualType ObjectType) {
31513cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
31523cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
31533cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
31543cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
31563cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
31573cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
31583cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
31593cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
3163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
3164124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                TemplateTypeParmTypeLoc TL,
3165124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                QualType ObjectType) {
3166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
3167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
317049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
3171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
3172124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         SubstTemplateTypeParmTypeLoc TL,
3173124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         QualType ObjectType) {
3174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
317549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
317649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
317749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
3178833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3179833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
3180833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3181833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
3182833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
3183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3184833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
3185833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
3186833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
3187833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
3188833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3189828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
3190828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
3191828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
3192828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
3193828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
3194833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3195833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
3196833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
3197833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
3198833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
3199833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3200833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3201833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
3202833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
3203dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
3204c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3205dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
3206577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3207833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
3208833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
3209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
3211833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
32121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
3213dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
3214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
3215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
32161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3217d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
3218d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3219d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3220d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
3221d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
3222d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
3223d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
3224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
3225d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
3226d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
32271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
3229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
3231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
3232833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
3233d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3235833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
3236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
3237833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
3238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
3239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
3240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
3241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
3242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
3243833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
32441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3245833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
3246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3250465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
3251465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                ElaboratedTypeLoc TL,
3252465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                QualType ObjectType) {
3253465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType *T = TL.getTypePtr();
3254465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
3255465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  NestedNameSpecifier *NNS = 0;
3256465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  // NOTE: the qualifier in an ElaboratedType is optional.
3257465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  if (T->getQualifier() != 0) {
3258465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3259e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                    TL.getQualifierRange(),
3260465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                    ObjectType);
3261465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (!NNS)
3262465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return QualType();
3263465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
32641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3265e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType NamedT;
3266e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // FIXME: this test is meant to workaround a problem (failing assertion)
3267e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // occurring if directly executing the code in the else branch.
3268e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (isa<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc())) {
3269e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc OldNamedTL
3270e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = cast<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc());
3271e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    const TemplateSpecializationType* OldTST
32729cbb4d81b98ee84795e267d51c1fa530ef6723bfJim Grosbach      = OldNamedTL.getType()->template getAs<TemplateSpecializationType>();
3273e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = TransformTemplateSpecializationType(OldTST, ObjectType);
3274e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3275e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3276e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc NewNamedTL
3277e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
3278e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewNamedTL.copy(OldNamedTL);
3279e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3280e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  else {
3281e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
3282e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3283e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3284e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3285a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar
3286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
3289e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      NamedT != T->getNamedType()) {
3290e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, NamedT);
3291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3295465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3296e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setKeywordLoc(TL.getKeywordLoc());
3297e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setQualifierRange(TL.getQualifierRange());
3298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33034714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
33044714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor                                                       DependentNameTypeLoc TL,
3305124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
33064714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T = TL.getTypePtr();
3307833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
3309e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3310e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                TL.getQualifierRange(),
3311edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                ObjectType);
3312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
3313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331533500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result
331633500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
331733500955d731c73717af52088b7fc0e7a85681e7John McCall                                            T->getIdentifier(),
331833500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getKeywordLoc(),
331933500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getQualifierRange(),
332033500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getNameLoc());
3321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
3323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3324e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
3325e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    QualType NamedT = ElabT->getNamedType();
332633500955d731c73717af52088b7fc0e7a85681e7John McCall    TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
332733500955d731c73717af52088b7fc0e7a85681e7John McCall
3328e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3329e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3330e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
333133500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3332e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
3333e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3334e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
3335e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setNameLoc(TL.getNameLoc());
3336e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
334133500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>::
334233500955d731c73717af52088b7fc0e7a85681e7John McCall          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
334333500955d731c73717af52088b7fc0e7a85681e7John McCall                                 DependentTemplateSpecializationTypeLoc TL,
334433500955d731c73717af52088b7fc0e7a85681e7John McCall                                                       QualType ObjectType) {
334533500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType *T = TL.getTypePtr();
334633500955d731c73717af52088b7fc0e7a85681e7John McCall
334733500955d731c73717af52088b7fc0e7a85681e7John McCall  NestedNameSpecifier *NNS
334833500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
334933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                TL.getQualifierRange(),
335033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ObjectType);
335133500955d731c73717af52088b7fc0e7a85681e7John McCall  if (!NNS)
335233500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
335333500955d731c73717af52088b7fc0e7a85681e7John McCall
335433500955d731c73717af52088b7fc0e7a85681e7John McCall  TemplateArgumentListInfo NewTemplateArgs;
335533500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
335633500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
335733500955d731c73717af52088b7fc0e7a85681e7John McCall
335833500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = T->getNumArgs(); I != E; ++I) {
335933500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateArgumentLoc Loc;
336033500955d731c73717af52088b7fc0e7a85681e7John McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(I), Loc))
336133500955d731c73717af52088b7fc0e7a85681e7John McCall      return QualType();
336233500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTemplateArgs.addArgument(Loc);
336333500955d731c73717af52088b7fc0e7a85681e7John McCall  }
336433500955d731c73717af52088b7fc0e7a85681e7John McCall
336533500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
336633500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getKeyword(),
336733500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NNS,
336833500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getIdentifier(),
336933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     TL.getNameLoc(),
337033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NewTemplateArgs);
337133500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Result.isNull())
337233500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
337333500955d731c73717af52088b7fc0e7a85681e7John McCall
337433500955d731c73717af52088b7fc0e7a85681e7John McCall  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
337533500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType NamedT = ElabT->getNamedType();
337633500955d731c73717af52088b7fc0e7a85681e7John McCall
337733500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the template specialization.
337833500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateSpecializationTypeLoc NamedTL
337933500955d731c73717af52088b7fc0e7a85681e7John McCall      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
338033500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setLAngleLoc(TL.getLAngleLoc());
338133500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setRAngleLoc(TL.getRAngleLoc());
338233500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
338333500955d731c73717af52088b7fc0e7a85681e7John McCall      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
338433500955d731c73717af52088b7fc0e7a85681e7John McCall
338533500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the elaborated type.
338633500955d731c73717af52088b7fc0e7a85681e7John McCall    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
338733500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setKeywordLoc(TL.getKeywordLoc());
338833500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setQualifierRange(TL.getQualifierRange());
338933500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
339033500955d731c73717af52088b7fc0e7a85681e7John McCall    TLB.pushFullCopy(TL);
339133500955d731c73717af52088b7fc0e7a85681e7John McCall  }
339233500955d731c73717af52088b7fc0e7a85681e7John McCall  return Result;
339333500955d731c73717af52088b7fc0e7a85681e7John McCall}
339433500955d731c73717af52088b7fc0e7a85681e7John McCall
339533500955d731c73717af52088b7fc0e7a85681e7John McCalltemplate<typename Derived>
3396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3398124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ObjCInterfaceTypeLoc TL,
3399124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3400ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCInterfaceType is never dependent.
3401c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3402c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return TL.getType();
3403c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3404c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
3405c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived>
3406c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType
3407c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
3408c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                ObjCObjectTypeLoc TL,
3409c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                QualType ObjectType) {
3410c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCObjectType is never dependent.
3411c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3412ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
3413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3418124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjCObjectPointerTypeLoc TL,
3419124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3420ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCObjectPointerType is never dependent.
3421c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3422ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
342324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
342424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
34311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
343843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
344143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
344343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
344443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
344643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
344743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
344943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
34511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
34581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
345943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
346143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
346343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
346443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
346743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3469264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  OwningExprResult LHS(SemaRef), RHS(SemaRef);
3470264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3471264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3472264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
34731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3474264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3475264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3476264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3477264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
34781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3479264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3480264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3481264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3482264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3483264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
34841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
348543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
348643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
348743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
348843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
348943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
349043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
349143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
349243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
349343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
349443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
349743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
349843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
349943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
350243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
350343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
350443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
350543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
350643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
350843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
350943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
351043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
351143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
351443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
351543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
351643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
351943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
352143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
352243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
352343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
352643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
352743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
352843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
352943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
353143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
35321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
35331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
353443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
35358cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  OwningExprResult Cond(SemaRef);
35368cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
35378cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
3538c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
35398cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
3540aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3541aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3542aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
35438cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
35448cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
354599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
35468cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3547c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
354899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
354999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3550eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
3551eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    // Convert the condition to a boolean value.
3552afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3553afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3554afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getIfLoc(),
3555afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               move(Cond));
3556afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3557afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3558eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
3559afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      Cond = move(CondE);
3560afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
356199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
3562c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3563eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3564eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3565eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3566eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
356743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
356843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
356943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
357043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
357343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
357443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
357543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3578eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor      FullCond->get() == S->getCond() &&
357999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
358043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
358143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
35821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
35831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3584eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
358599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    move(Then),
35861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
358743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
358843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
358943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
359043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
359243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
3593d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  OwningExprResult Cond(SemaRef);
3594d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3595d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3596c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
3597d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3598aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3599aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3600aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
3601d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3602d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
360399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3604d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3605c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
360699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
360799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
360899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
3611586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult Switch
3612586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), move(Cond),
3613586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          ConditionVar);
361443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
361543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
361843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
361943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
362043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
362343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
362443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
362543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
362843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
36291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
363043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
36315656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  OwningExprResult Cond(SemaRef);
36325656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
36335656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
3634c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
36355656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
3636aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3637aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3638aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
36395656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
36405656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
364199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
36425656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3643c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
364499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
364599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3646afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3647afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3648afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
3649afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3650eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                                             S->getWhileLoc(),
3651afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               move(Cond));
3652afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3653afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3654afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      Cond = move(CondE);
3655afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
365699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3658eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3659eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3660eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3661eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
366243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
366343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
366443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
366543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
366743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
3668eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor      FullCond->get() == S->getCond() &&
366999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
367043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3673eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
3674586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                       ConditionVar, move(Body));
367543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
367743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
367843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
367943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
368043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
368143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
368243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
368343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3685eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  // Transform the condition
3686eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3687eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (Cond.isInvalid())
3688eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3689eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
369043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
369143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
369243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
369543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
369643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
369743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
369843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
370143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
370343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
370443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
370543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
370643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
370999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  OwningExprResult Cond(SemaRef);
371099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
371199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
3712c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
371399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
3714aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3715aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3716aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
371799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
371899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
371999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
372099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3721c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
372299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
372399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3724afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3725afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3726afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
3727afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3728afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getForLoc(),
3729afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               move(Cond));
3730afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3731afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3732afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3733afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      Cond = move(CondE);
3734afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
373599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3737eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond));
3738eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (!S->getConditionVariable() && S->getCond() && !FullCond->get())
3739eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3740eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
374143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
374243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
374343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
374443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3746eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc));
3747eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (S->getInc() && !FullInc->get())
3748eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3749eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
375043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
375143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
375243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
375343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
375543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
375643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
3757eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor      FullCond->get() == S->getCond() &&
375843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
375943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
37601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
37611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
376243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
3763eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                     move(Init), FullCond, ConditionVar,
3764eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                     FullInc, S->getRParenLoc(), move(Body));
376543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
376643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
376743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
37681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
37691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
377043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
37711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
377243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
377343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
377443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
377543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
377643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
377843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
377943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
378043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
378243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
378343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
37841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
378543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
378643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
378743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
378843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
378943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
379043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
379143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
37931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
379443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
379643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
379743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
37991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
380043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
380243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
380343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
380543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
380643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
380743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
380843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
38091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
381043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
381143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
381243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
381443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
381543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
381743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
381843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
381943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
382043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
3821aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
3822aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                         *D);
382343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
382443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
38251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
382743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
38281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
383043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
38311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
38341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
383643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
383743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
384043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
384243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
38431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
384443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
384543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
384643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
384743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
384843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3849c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3850703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema());
3851703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema());
3852ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 4> Names;
3853a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
3854703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningExprResult AsmString(SemaRef);
3855703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema());
3856703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3857703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  bool ExprsChanged = false;
3858c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3859703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the outputs.
3860703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
3861ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getOutputIdentifier(I));
3862c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3863703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3864703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain());
3865c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3866703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the output expr.
3867703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *OutputExpr = S->getOutputExpr(I);
3868703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(OutputExpr);
3869703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3870703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3871c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3872703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != OutputExpr;
3873c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3874703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Exprs.push_back(Result.takeAs<Expr>());
3875703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3876c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3877703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the inputs.
3878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
3879ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getInputIdentifier(I));
3880c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3882703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain());
3883c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3884703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the input expr.
3885703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *InputExpr = S->getInputExpr(I);
3886703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(InputExpr);
3887703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3889c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3890703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != InputExpr;
3891c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3892703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Exprs.push_back(Result.takeAs<Expr>());
3893703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3894c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3895703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
3896703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    return SemaRef.Owned(S->Retain());
3897703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3898703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the clobbers.
3899703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
3900703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Clobbers.push_back(S->getClobber(I)->Retain());
3901703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3902703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // No need to transform the asm string literal.
3903703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  AsmString = SemaRef.Owned(S->getAsmString());
3904703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3905703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
3906703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isSimple(),
3907703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isVolatile(),
3908703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumOutputs(),
3909703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumInputs(),
3910a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson                                     Names.data(),
3911703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Constraints),
3912703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Exprs),
3913703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move(AsmString),
3914703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Clobbers),
3915703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getRParenLoc(),
3916703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isMSAsm());
391743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
391843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
391943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
392043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
392143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
39234dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body of the @try.
39244dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
39254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (TryBody.isInvalid())
39264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
3927c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39288f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  // Transform the @catch statements (if present).
39298f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool AnyCatchChanged = false;
39308f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> CatchStmts(SemaRef);
39318f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
39328f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
39334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Catch.isInvalid())
39344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
39358f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    if (Catch.get() != S->getCatchStmt(I))
39368f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      AnyCatchChanged = true;
39378f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    CatchStmts.push_back(Catch.release());
39384dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
3939c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39404dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the @finally statement (if present).
39414dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult Finally(SemaRef);
39424dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (S->getFinallyStmt()) {
39434dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    Finally = getDerived().TransformStmt(S->getFinallyStmt());
39444dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Finally.isInvalid())
39454dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
39464dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
39474dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
39484dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
39494dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
39504dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      TryBody.get() == S->getTryBody() &&
39518f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      !AnyCatchChanged &&
39524dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Finally.get() == S->getFinallyStmt())
39534dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
3954c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39554dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
39564dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), move(TryBody),
39578f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                           move_arg(CatchStmts), move(Finally));
395843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
396043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
396143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
3963be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  // Transform the @catch parameter, if there is one.
3964be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *Var = 0;
3965be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (VarDecl *FromVar = S->getCatchParamDecl()) {
3966be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    TypeSourceInfo *TSInfo = 0;
3967be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (FromVar->getTypeSourceInfo()) {
3968be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
3969be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (!TSInfo)
3970be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor        return SemaRef.StmtError();
3971be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3972c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3973be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    QualType T;
3974be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (TSInfo)
3975be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = TSInfo->getType();
3976be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    else {
3977be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = getDerived().TransformType(FromVar->getType());
3978be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (T.isNull())
3979c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt        return SemaRef.StmtError();
3980be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3981c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3982be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
3983be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (!Var)
3984be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      return SemaRef.StmtError();
3985be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
3986c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3987be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getCatchBody());
3988be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (Body.isInvalid())
3989be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return SemaRef.StmtError();
3990c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3991c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
3992be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             S->getRParenLoc(),
3993be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             Var, move(Body));
399443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
399643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
399743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
39994dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body.
40004dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
40014dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (Body.isInvalid())
40024dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
4003c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40044dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
40054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
40064dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Body.get() == S->getFinallyBody())
40074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
40084dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
40094dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
40104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
40114dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor                                               move(Body));
401243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
401443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
401543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
40161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
4017d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  OwningExprResult Operand(SemaRef);
4018d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (S->getThrowExpr()) {
4019d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    Operand = getDerived().TransformExpr(S->getThrowExpr());
4020d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    if (Operand.isInvalid())
4021d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      return getSema().StmtError();
4022d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
4023c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4024d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4025d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      Operand.get() == S->getThrowExpr())
4026d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    return getSema().Owned(S->Retain());
4027c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4028d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), move(Operand));
402943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
403143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
403243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
403343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
40341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
40358fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the object we are locking.
40368fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
40378fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Object.isInvalid())
40388fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
4039c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40408fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the body.
40418fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getSynchBody());
40428fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Body.isInvalid())
40438fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
4044c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40458fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // If nothing change, just retain the current statement.
40468fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
40478fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Object.get() == S->getSynchExpr() &&
40488fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Body.get() == S->getSynchBody())
40498fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.Owned(S->Retain());
40508fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor
40518fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Build a new statement.
40528fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
40538fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor                                                    move(Object), move(Body));
405443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
405543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
405643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
405743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
405843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
40591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
4060c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the element statement.
4061c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult Element = getDerived().TransformStmt(S->getElement());
4062c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Element.isInvalid())
4063c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4064c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4065c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the collection expression.
4066c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningExprResult Collection = getDerived().TransformExpr(S->getCollection());
4067c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Collection.isInvalid())
4068c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4069c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4070c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the body.
4071c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
4072c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Body.isInvalid())
4073c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4074c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4075c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // If nothing changed, just retain this statement.
4076c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
4077c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Element.get() == S->getElement() &&
4078c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Collection.get() == S->getCollection() &&
4079c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Body.get() == S->getBody())
4080c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.Owned(S->Retain());
4081c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4082c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Build a new statement.
4083c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
4084c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   /*FIXME:*/S->getForLoc(),
4085c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Element),
4086c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Collection),
4087c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   S->getRParenLoc(),
4088c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   move(Body));
408943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
409043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
409143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
409243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
409343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
409443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
409543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
409643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
409743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
409843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
409943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
410043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
410143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
410243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
410343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
410443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
41051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
410643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
410743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
4108a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                            ExceptionDecl->getTypeSourceInfo(),
410943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
411043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
411143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
411243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
411343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
411443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
411543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
411643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
411743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
411843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
412043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
412143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
412243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
412343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
412443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
412543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
412643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
412843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
412943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
413043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
413243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
413343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
413443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
413543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
413643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
41371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
413843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
413943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
414043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
414143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
41421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
414343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
414443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
414543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
41461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
414743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
414843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
414943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
415043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
41511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
415243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
415343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
415443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
41551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
415643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
415743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
415843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
416043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
416143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
416243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
416443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
416543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
41661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
416743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
41681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
416943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
4170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
4171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
41721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4174454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
41751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
41761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
41771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4180454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
4181a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
4182a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
4183a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4184edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                       E->getQualifierRange());
4185a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
4186a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
4187a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4188dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4189dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
41907c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
41917c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getDecl()));
4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
4193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4195c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (!getDerived().AlwaysRebuild() &&
4196a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
4197a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
4198dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      !E->hasExplicitTemplateArgumentList()) {
41991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4200dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
4201dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
4202dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
4203a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
4204dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return SemaRef.Owned(E->Retain());
4205a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4206dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4207dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
4208dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  if (E->hasExplicitTemplateArgumentList()) {
4209dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
4210dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4211dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
4212dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4213dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TemplateArgumentLoc Loc;
4214dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4215dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall        return SemaRef.ExprError();
4216dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TransArgs.addArgument(Loc);
4217dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    }
4218dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
4219dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4220a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
4221dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                         ND, E->getLocation(), TemplateArgs);
4222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4226454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
42271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4232454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
42331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4238454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
42391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
42431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4244454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
42451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4250454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
42511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4256454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
42621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
4265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
42691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4270454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
4271454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
4279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
42858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
42868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform the type.
42878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
42888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!Type)
42898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().ExprError();
4290c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform all of the components into components similar to what the
42928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // parser uses.
4293c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // FIXME: It would be slightly more efficient in the non-dependent case to
4294c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // just map FieldDecls, rather than requiring the rebuilder to look for
4295c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // the fields again. However, __builtin_offsetof is rare enough in
42968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // template code that we don't care.
42978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool ExprChanged = false;
42988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef Action::OffsetOfComponent Component;
42998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
43008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  llvm::SmallVector<Component, 4> Components;
43018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
43028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    const Node &ON = E->getComponent(I);
43038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Component Comp;
430472be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor    Comp.isBrackets = true;
43058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocStart = ON.getRange().getBegin();
43068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocEnd = ON.getRange().getEnd();
43078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
43088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array: {
43098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
43108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(FromIndex);
43118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (Index.isInvalid())
43128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return getSema().ExprError();
4313c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      ExprChanged = ExprChanged || Index.get() != FromIndex;
43158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = true;
43168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.E = Index.takeAs<Expr>(); // FIXME: leaked
43178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
43188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4319c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
43218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
43228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = false;
43238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.IdentInfo = ON.getFieldName();
432429d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor      if (!Comp.U.IdentInfo)
432529d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor        continue;
4326c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4328c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4329cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case Node::Base:
4330cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Will be recomputed during the rebuild.
4331cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
43328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4333c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Components.push_back(Comp);
43358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
4336c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // If nothing changed, retain the existing expression.
43388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
43398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Type == E->getTypeSourceInfo() &&
43408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      !ExprChanged)
43418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return SemaRef.Owned(E->Retain());
4342c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Build a new offsetof expression.
43448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
43458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          Components.data(), Components.size(),
43468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          E->getRParenLoc());
43478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
43488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
43498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived>
43508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorSema::OwningExprResult
4351454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
4353a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
43545557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
4355a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
43565ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43595ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
43611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43625ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
43631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
43681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
43731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
43881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4389454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
44111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4412454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
44301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
44411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
44501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4451454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
445683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
445783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
445983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4460edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  E->getQualifierRange());
4461c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
446283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
446383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
44641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4465f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
44667c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
44677c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getMemberDecl()));
4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44716bb8017bb9e828d118e15e59d71c66bba323c364John McCall  NamedDecl *FoundDecl = E->getFoundDecl();
44726bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (FoundDecl == E->getMemberDecl()) {
44736bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = Member;
44746bb8017bb9e828d118e15e59d71c66bba323c364John McCall  } else {
44756bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = cast_or_null<NamedDecl>(
44766bb8017bb9e828d118e15e59d71c66bba323c364John McCall                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
44776bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!FoundDecl)
44786bb8017bb9e828d118e15e59d71c66bba323c364John McCall      return SemaRef.ExprError();
44796bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
44806bb8017bb9e828d118e15e59d71c66bba323c364John McCall
4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
448383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
44848a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
44856bb8017bb9e828d118e15e59d71c66bba323c364John McCall      FoundDecl == E->getFoundDecl() &&
44861f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson      !E->hasExplicitTemplateArgumentList()) {
4487c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
44881f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
44891f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
44901f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44921f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
4493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4494d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
44958a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  if (E->hasExplicitTemplateArgumentList()) {
4496d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4497d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
44988a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4499d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
4500d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
45018a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
4502d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
45038a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
45048a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
4505c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
4507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
4508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4510c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
4511c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
4512c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
4513c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
4514c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
4515c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
4516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
4517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
451883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
451983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
45218a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
45226bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                        FoundDecl,
4523d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                        (E->hasExplicitTemplateArgumentList()
4524d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
4525c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
4526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4530454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
4531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
45421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
4545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
4546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
45481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
4551454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
4552454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4557454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
45751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
457747e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
45781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
457947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
4580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
4581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
45841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4585454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
4586a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
4587a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
45886eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
4589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4593454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
45949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
45959d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
45981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
4600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
46011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46029d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
46039d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
46049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4608a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
46096eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
46149d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
46161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
46199d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            NewT,
4620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
4621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
4622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4626454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
462742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
462842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
462942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
463042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return SemaRef.ExprError();
46311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
4633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
463742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      OldT == NewT &&
4638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
46391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
46411d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // Note: the expression type doesn't necessarily match the
46421d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // type-as-written, but that's okay, because it should always be
46431d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // derivable from the initializer.
46441d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
464542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
4646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
4647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
4648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4652454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
4653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
46591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
46621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
4663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
4665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4671454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
46731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
46851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
4688e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4693454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
46951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
469643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
470143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
4703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
47131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
4715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
47181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
4724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
47261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
47281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
4739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
47411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
47441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
4756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
47601eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
4762454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
47635557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4764c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
47655557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
47665557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
4767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
47741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
47791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4780454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
47831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
4789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
48001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
48061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4807454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4831454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4837c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntSema::OwningExprResult
4838454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
48391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
48471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
4850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4855454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
4856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
4857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
4859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
48601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
4866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
4867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
4872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
48731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4881454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
48981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
4902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
49041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
49061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4907454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
49081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4913454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4914668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
4915668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
4916668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
4917668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
4918668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
4919668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4920668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4921c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4922668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
4923668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
4924668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4925668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4926668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
4927668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4928668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4929668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      return SemaRef.ExprError();
4930668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4931668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
4932668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
4933668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
4934668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
4935668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4936668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
4937668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4938668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4939668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
49406eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      if (getDerived().DropCallArgument(E->getArg(I)))
49416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor        break;
4942c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4943668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4944668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4945668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        return SemaRef.ExprError();
4946668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4947668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      // FIXME: Poor source location information.
4948668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      SourceLocation FakeCommaLoc
4949668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        = SemaRef.PP.getLocForEndOfToken(
4950668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4951668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      FakeCommaLocs.push_back(FakeCommaLoc);
4952668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      Args.push_back(Arg.release());
4953668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    }
4954668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4955668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return getDerived().RebuildCallExpr(move(Object), FakeLParenLoc,
4956668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
4957668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        FakeCommaLocs.data(),
4958668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
4959668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4960668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4961668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4962668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
4963668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4964668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
4965668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
4966668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
4967668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
4968668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4969668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
4970668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
4971668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4972668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4973668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4974668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4975668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4976668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4977668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4978668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4983454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
49931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
49971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
49981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
49991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
5001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
50021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
5003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
5004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5009454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
5010454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
5011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
50141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5015454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
50169d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
50179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
50201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
5021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
50231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50249d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
50259d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
50269d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5030a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
50316eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
50369d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
50381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
50411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
5042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
5044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
5045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
5046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
5047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
50481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
5049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
50509d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                              NewT,
5051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
5052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
5053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
5054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
50581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5059454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
5060454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5065454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
5066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
5072454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
5073454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5078454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
5079454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
5085454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
50869d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
50879d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
50901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50919d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
50929d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
50939d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5097a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
50986eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
51039d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
51051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
5108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
5109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
51109d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                   NewT,
5111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
5112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
5114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5118454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
512057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    TypeSourceInfo *TInfo
512157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor      = getDerived().TransformType(E->getTypeOperandSourceInfo());
512257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    if (!TInfo)
5123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
512657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor        TInfo == E->getTypeOperandSourceInfo())
5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
51281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
512957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getType(),
513057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             E->getLocStart(),
513157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             TInfo,
5132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
5133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
5137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
51381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
51401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
5142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
51471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
514957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getType(),
515057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                           E->getLocStart(),
5151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
5152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
5153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
51561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5157454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
5164454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
51651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5170454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
5171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
51721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
5179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
51801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5181828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5186454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
5187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
51931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
5196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5200454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
52011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
52027c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
52037c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
5204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
5205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
520753cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
5208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
52101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5211036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
5212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5216454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
5217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
52251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
52261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
5228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
5229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
5230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
5231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5235454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
5236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
5237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
5239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
5240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
5243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
5244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
5245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
5248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
5250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
5251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
5252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
52541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
5256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
5257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
525943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
5260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
5261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
5262ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor    if (getDerived().DropCallArgument(E->getConstructorArg(I)))
5263ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor      break;
5264ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor
5265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
5266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
52681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
5270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
5271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
52741af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
52751af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
52761af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
52777c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52787c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
52791af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
52801af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52831af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
52841af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
52851af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
52867c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
52877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
52881af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
52891af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52901af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52911af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
52931af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
52941af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
52957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52967c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
52971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
52981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5300c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
5303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
53041af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
53051af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
53061af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
53071af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
53081af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53091af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53101af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
53111af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
53121af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
53131af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
53141af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53151af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53171af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
53205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
53215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
53225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
53235b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
53245b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
53255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
53265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
53275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
53285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
53295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
5330c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      ArraySize
53315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
5332c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                  ConsArrayT->getSize(),
53335b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  SemaRef.Context.getSizeType(),
53345b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  /*FIXME:*/E->getLocStart()));
53355b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
53365b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
53375b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
53385b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
53395b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
53405b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
53415b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
53425b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
53435b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
5344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
5345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
5346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
5348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
5350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
5351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
5353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
5354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
53561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
5357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5361454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
5362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
5363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
5364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
53651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
53671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
53681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
53691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
53707c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
53717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
53721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
53731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
53741af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5375c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
53771af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
53781af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
53791af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53801af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53841af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
5388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
5389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
5390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5394a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
5395454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
5396a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
5397a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
5398a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
53991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5400a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  Sema::TypeTy *ObjectTypePtr = 0;
5401a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
5402c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5403a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
5404a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
5405a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
5406a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
5407a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
5408a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    return SemaRef.ExprError();
5409c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5410a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr);
5411a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
5412a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5413b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor                                                E->getQualifierRange(),
5414a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                ObjectType);
5415a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
5416a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
54171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5418a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
5419a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
5420a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
5421a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
5422a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
5423a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5424a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
5425a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
5426a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
5427a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
5428a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
5429a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
5430a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
5431a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
5432a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    CXXScopeSpec SS;
5433a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (Qualifier) {
5434a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setScopeRep(Qualifier);
5435a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setRange(E->getQualifierRange());
5436a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    }
5437c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5438a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(),
5439a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
5440a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
5441a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
5442a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
5443a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
5444a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
5445a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5446c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5447a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
5448a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
5449a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
5450a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
545126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
545226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
545326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
5454c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
5455a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                               ObjectType);
545626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
5457a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
5458a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
5459c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5460a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
5461a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
5462a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
5463a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
546426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getQualifierRange(),
546526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
546626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
5467fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
5468a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
5469a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
54701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5471a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
5472a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
5473ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
5474454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
5475f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
5476f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5477f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
5478f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
5479f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5480f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
5481f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
5482f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
54837c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
54847c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
54857c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
54869f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
54879f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
54889f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
54899f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
54909f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
54919f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
54929f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
54939f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5494f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5495f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
5496f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
5497f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5498f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
5500f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
5501f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
5502f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
5503f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5504f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
5505f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5506f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5507f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
5508f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
5509f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
5510f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5511f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
5512f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
5513f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
5514f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
5515f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5516edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                    Old->getQualifierRange());
5517f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
5518f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5519c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5520f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
5521f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
5522c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  }
5523c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5524c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (Old->getNamingClass()) {
552566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    CXXRecordDecl *NamingClass
552666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
552766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                            Old->getNameLoc(),
552866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
552966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
553066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5531c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
553266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5533f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5534f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5535f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
5536f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
5537f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
5538f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5539f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
5540f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
5541f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
5542f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5543f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
5544f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
5545f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5546f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
5547f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5548f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5549f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
5550f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
5551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5555454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
5556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
55571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
5559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
5564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
55651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
5567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
55691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
5571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
5572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
5573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
5574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
5575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5579865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
5580454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  DependentScopeDeclRefExpr *E) {
5581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
5582f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5583edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                E->getQualifierRange());
5584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
5585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
558881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
558981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
559081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
55911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5592f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
5593f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
5594f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
5595f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        Name == E->getDeclName())
5596f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
55971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5598f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5599f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
5600f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         Name, E->getLocation(),
5601f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
5602f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
5603d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
5604d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5606d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5607d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5609d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5612f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5613f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
5614f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       Name, E->getLocation(),
5615f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
5616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5620454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
5621321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
5622321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
5623321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
5624321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5625321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
5626321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
5627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
56357c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
56367c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
56421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
5644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
56456eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
56466eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
56476eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
56486eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
56496eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
5650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
56531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
5656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
5661c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
56621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
56631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
5664c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
5666c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
56671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56684411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
56694411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
5670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
5671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
5674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56755132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
56765132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
5677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5679454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
56805132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5683eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// \brief Transform a C++ reference-binding expression.
5684eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson///
5685eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// Since CXXBindReferenceExpr nodes are implicitly generated, we just
5686eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// transform the subexpression and return that.
5687eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssontemplate<typename Derived>
5688eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonSema::OwningExprResult
5689eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonTreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
5690eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  return getDerived().TransformExpr(E->getSubExpr());
5691eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
5692eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
56931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
5694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
5695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56965132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
56975132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
5698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
57015132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
57025132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5708454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXTemporaryObjectExpr *E) {
5709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
5716c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                  getDerived().TransformDecl(E->getLocStart(),
57177c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
57241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
5726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
572791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
572891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      ArgumentChanged = true;
572991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      break;
573091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    }
573191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor
5732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
57351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
5738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
574391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
574491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
574591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
5746a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth    return SemaRef.MaybeBindToTemporary(E->Retain());
574791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
57481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
5750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
5751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
5752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
57531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
5754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
5755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
5757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
5758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
5759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
5760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
5761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
5762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5767454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
5768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
5770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
5775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
5776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
5778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
5779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
57821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
5785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
5786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
5787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
5791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
57921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
57931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
5795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
5796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
5797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
5798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
5799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
5800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
5801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
58021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5805865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
5806454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXDependentScopeMemberExpr *E) {
5807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
5808aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
5809aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
5810aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5811aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
5812aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
5813aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
5814aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
5815aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5816aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
58171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5818aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
5819aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Sema::TypeTy *ObjectTy = 0;
5820d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
5821aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
5822aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
5823a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
5824d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
5825d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
5826aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5827aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5828aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
5829aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
5830aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5831aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5832aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
5833aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
5834aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5835aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
58361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58376cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
58386cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
5839c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
58406cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
58416cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
58426cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
58431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5844a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
5845a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
5846a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5847a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
5848aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
5849aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
5850a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
5851a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
5852a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
58531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
5855dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
5856aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            ObjectType);
585781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
585881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
58591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5860aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
58613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
58623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
58633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
5864aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
5865aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
58663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
58673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
58683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
58691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
58701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5871865d447ac6a4721ab58e898d014a21f2eff74b06John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5872aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
58733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
58743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
58753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
58763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
5877129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
58783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
58793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
5880129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
58813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
5883d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
58843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5885d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5886d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
58873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
5888d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
58893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5891865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(move(Base),
5892aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
5893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
5894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
5895a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
5896a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
58973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
5898129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     Name,
5899129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     E->getMemberLoc(),
5900129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
5901129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
5902129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5903129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
5904129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult
5905454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5906129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
5907aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  OwningExprResult Base(SemaRef, (Expr*) 0);
5908aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
5910aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
5911aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5912aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5913aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5914aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5915aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5916aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5917129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5918129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5919129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5920129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5921129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5922edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  Old->getQualifierRange());
5923129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5924129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      return SemaRef.ExprError();
5925129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5926129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5927129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  LookupResult R(SemaRef, Old->getMemberName(), Old->getMemberLoc(),
5928129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5929129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5930129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5931129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5932129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
59337c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
59347c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
59357c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
59369f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
59379f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
59389f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
59399f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
59409f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
59419f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
59429f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
59439f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5944129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5945129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5946129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5947129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5948129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5949129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5950129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5951129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5952129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5953129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5954129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5955129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5956129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5957129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5958129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5959c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  // Determine the naming class.
5960042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth  if (Old->getNamingClass()) {
5961c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    CXXRecordDecl *NamingClass
5962c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
596366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                          Old->getMemberLoc(),
596466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
596566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
596666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5967c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
596866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5969c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
5970c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5971129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5972129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5973129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5974129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5975129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5976129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5977129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5978129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5979129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        return SemaRef.ExprError();
5980129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5981129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5982129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5983c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
5984c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5985c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5986c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5987c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5988c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5989c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5990129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  return getDerived().RebuildUnresolvedMemberExpr(move(Base),
5991aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
5992129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
5993129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
5994129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
5995129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
5996c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
5997129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
5998129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
5999129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
6000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
6004454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
60051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6010454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
601181d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *EncodedTypeInfo
601281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
601381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!EncodedTypeInfo)
6014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
60151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
601781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
60181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
6019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
602181d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                            EncodedTypeInfo,
6022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
6023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
6027454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
602892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Transform arguments.
602992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  bool ArgChanged = false;
603092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
603192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
603292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
603392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Arg.isInvalid())
603492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
6035c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
603692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
603792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Args.push_back(Arg.takeAs<Expr>());
603892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
603992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
604092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
604192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Class message: transform the receiver type.
604292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    TypeSourceInfo *ReceiverTypeInfo
604392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      = getDerived().TransformType(E->getClassReceiverTypeInfo());
604492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!ReceiverTypeInfo)
604592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
6046c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
604792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If nothing changed, just retain the existing message send.
604892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
604992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
605092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.Owned(E->Retain());
605192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
605292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Build a new class message send.
605392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
605492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getSelector(),
605592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getMethodDecl(),
605692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getLeftLoc(),
605792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               move_arg(Args),
605892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getRightLoc());
605992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
606092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
606192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Instance message: transform the receiver
606292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
606392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor         "Only class and instance messages may be instantiated");
606492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult Receiver
606592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    = getDerived().TransformExpr(E->getInstanceReceiver());
606692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (Receiver.isInvalid())
606792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.ExprError();
606892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
606992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // If nothing changed, just retain the existing message send.
607092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
607192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
607292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.Owned(E->Retain());
6073c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
607492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Build a new instance message send.
607592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  return getDerived().RebuildObjCMessageExpr(move(Receiver),
607692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getSelector(),
607792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getMethodDecl(),
607892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getLeftLoc(),
607992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             move_arg(Args),
608092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getRightLoc());
6081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6085454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
60861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6091454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
6092ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return SemaRef.Owned(E->Retain());
6093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6097454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
6098f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
6099f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6100f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6101f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6102f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor
6103f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // We don't need to transform the ivar; it will never change.
6104c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6105f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6106f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6107f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6108f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6109c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6110f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  return getDerived().RebuildObjCIvarRefExpr(move(Base), E->getDecl(),
6111f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->getLocation(),
6112f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->isArrow(), E->isFreeIvar());
6113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6117454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
6118e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // Transform the base expression.
6119e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6120e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (Base.isInvalid())
6121e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.ExprError();
6122c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6123e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // We don't need to transform the property; it will never change.
6124c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6125e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // If nothing changed, just retain the existing expression.
6126e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6127e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      Base.get() == E->getBase())
6128e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.Owned(E->Retain());
6129c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6130e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  return getDerived().RebuildObjCPropertyRefExpr(move(Base), E->getProperty(),
6131e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                 E->getLocation());
6132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
613609105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
6137454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
61389cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If this implicit setter/getter refers to class methods, it cannot have any
61399cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // dependent parts. Just retain the existing declaration.
61409cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (E->getInterfaceDecl())
61419cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6142c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61439cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // Transform the base expression.
61449cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
61459cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (Base.isInvalid())
61469cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.ExprError();
6147c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61489cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // We don't need to transform the getters/setters; they will never change.
6149c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61509cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If nothing changed, just retain the existing expression.
61519cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
61529cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor      Base.get() == E->getBase())
61539cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6154c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61559cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
61569cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getGetterMethod(),
61579cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getType(),
61589cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getSetterMethod(),
61599cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getLocation(),
61609cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             move(Base));
6161c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6166454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
6167ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // Can never occur in a dependent context.
61681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6173454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
6174f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
6175f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6176f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6177f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6178c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6179f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6180f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6181f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6182f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6183c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6184f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  return getDerived().RebuildObjCIsaExpr(move(Base), E->getIsaMemberLoc(),
6185f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                         E->isArrow());
6186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6190454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
6191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
6193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
6194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
6195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
6196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
61971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
6199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
6200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
62011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
62041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
62051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
6207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
6208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
6209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6213454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
6214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
6215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
62161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6221454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
6222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
6223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
62241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
6229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
623285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
623385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
62342865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildPointerType(PointeeType, Star,
6235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
6236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
623985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
624085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
62412865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Star,
6242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
6243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
624785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
624885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
624985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
62502865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
625185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
6252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
625685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
625785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
625885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
62592865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
626085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
6261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
62641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
6265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
6266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
6267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
6268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
6269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
6270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
6271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
6272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
6273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
6274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
62751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
62771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
62781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
62791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
6280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
6281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
6282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
6283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
6284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
6285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
6286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
6287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
62881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
62901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
6291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
62921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
6293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
62941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
62961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
62971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
6298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
6299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
630085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
630185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
63021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
630385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
6304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
6309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
631085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
631185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
63121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
631385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
6314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
6319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
6320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
6321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
6322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
63231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
6325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
6331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
6332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
6333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
6334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
63351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
6336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
6337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
634282287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       unsigned NumElements,
634382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       bool IsAltiVec, bool IsPixel) {
6344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
634582287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  return SemaRef.Context.getVectorType(ElementType, NumElements,
634682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson                                       IsAltiVec, IsPixel);
6347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
6351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
6352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
6353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
6354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
6355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
63561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
6357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
6358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
6359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
6360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
6365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
6366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
6367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
6368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
63721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
6373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
63741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
6375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
63761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
6377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
6378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
6379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
6380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
6384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
6385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
6386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
6387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
6388ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
6389ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
6390ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
6391ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
639292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // FIXME: Doesn't account for ObjCInterfaceDecl!
6393ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
6394ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
6395ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
6396ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
6397ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
6398ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6399ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
6400ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
6401ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
6402c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6403ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
6404ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
6405ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
6406ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
6407ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
6408ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6409ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
6410ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
6411ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6412ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
6413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
6414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
6415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
6419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
6420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
6424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
6425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
6429833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
6430833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
6431d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
6432d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
6433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6435dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6436dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6437dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6438dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6439a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
6440c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
6441d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
6442dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
6443dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
6444dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
6445dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
6446dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
64471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
6448495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
6449c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
6450c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
645146646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
6452dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6453dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6454dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6455dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6456dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6457dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6458dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
6459dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
6460dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6461dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6462dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6463dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6464dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6465dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6466dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
6467edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   QualType T) {
6468edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor  if (T->isDependentType() || T->isRecordType() ||
6469dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
6470a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6471dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
6472dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
6473dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
64741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6475dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
6476dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
6477dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
64781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6479d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
64801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6481d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6482d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
6483d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
64841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
6485d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
6486d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
6487d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
6488d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
64891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6490d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
64913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
64923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
6493d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
6494d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
64951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
6496014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
6497014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
64983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
64993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
65003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
6501014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor                                              Name,
6502a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
6503a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
65043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
6505d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
65061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6508ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
6509ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6510ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
6511ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
6512ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
6513ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6514ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
6515ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
6516ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
6517ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
6518ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
6519ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  return getSema().ActOnDependentTemplateName(
6520ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6521ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              SS,
6522ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              Name,
6523a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              ObjectType.getAsOpaquePtr(),
6524a481edb1b11c956a46cb42cd0dc4dd9851c10801Douglas Gregor                                              /*EnteringContext=*/false)
6525ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor           .template getAsVal<TemplateName>();
6526ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
6527c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6528ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
65291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
6531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
6532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
6533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
6534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
6535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
6536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
6537ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  Expr *CalleeExpr = ((Expr *)Callee.get())->IgnoreParenCasts();
6538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
65391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
6541f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
6542f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl    if (!FirstExpr->getType()->isOverloadableType() &&
6543f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl        !SecondExpr->getType()->isOverloadableType())
6544f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl      return getSema().CreateBuiltinArraySubscriptExpr(move(First),
6545ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                 CalleeExpr->getLocStart(),
6546f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl                                                       move(Second), OpLoc);
65471a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
65481a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
65491a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc);
6550f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  } else if (SecondExpr == 0 || isPostIncDec) {
6551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
6552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
6553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
65541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
6555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
65561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
6558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
65601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
6561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
6562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
6563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
6564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
65651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
6566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
6567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
6568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
65691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
6571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
6572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
6573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
65751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
6577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
65786e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
65791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6580ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(CalleeExpr)) {
6581ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
6582ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
6583ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
6584ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
65856e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
6586ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
65876e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.addDecl(cast<DeclRefExpr>(CalleeExpr)->getDecl());
6588ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
65891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
6591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
6592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
65931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
6595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
65961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
6597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
6598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
6599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6601f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
6602ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(CalleeExpr->getLocStart(),
6603ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
6604ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(First),
6605ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      move(Second));
6606f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
6607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
66081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
6609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
66101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
6611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
6612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
6613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
66141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
6616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
66171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
6618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
662026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
6621c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntSema::OwningExprResult
662226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas GregorTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(ExprArg Base,
662326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
662426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
662526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                 NestedNameSpecifier *Qualifier,
662626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceRange QualifierRange,
662726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
662826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
6629fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
6630a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
663126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  CXXScopeSpec SS;
663226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (Qualifier) {
663326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setRange(QualifierRange);
663426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setScopeRep(Qualifier);
663526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
663626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
663726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  Expr *BaseE = (Expr *)Base.get();
663826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  QualType BaseType = BaseE->getType();
6639a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (BaseE->isTypeDependent() || Destroyed.getIdentifier() ||
664026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
6641c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      (isArrow && BaseType->getAs<PointerType>() &&
6642bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
6643bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
664426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
664526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    return SemaRef.BuildPseudoDestructorExpr(move(Base), OperatorLoc,
664626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
6647fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
6648a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
664926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
665026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
6651c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6652a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
665326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  DeclarationName Name
665426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXDestructorName(
665526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                SemaRef.Context.getCanonicalType(DestroyedType->getType()));
6656c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
665726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
6658c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
665926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  return getSema().BuildMemberReferenceExpr(move(Base), BaseType,
666026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
666126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
6662a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            Name, Destroyed.getLocation(),
666326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
666426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
666526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
6666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
6667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
6669