TreeTransform.h revision 0b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68
157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner//===------- 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.
757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner//===----------------------------------------------------------------------===//
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//
1257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner//===----------------------------------------------------------------------===//
1357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H
16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
172d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h"
18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h"
198491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor#include "clang/Sema/ParsedTemplate.h"
20dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
21781472fe99a120098c631b0cbe33c89f8cef5e70John McCall#include "clang/Sema/ScopeInfo.h"
22c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
237cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h"
24657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
25b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
3019510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Ownership.h"
3119510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h"
32b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
33a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h"
347e44e3fcd75147f229f42e6912898ce62d6b4d08Douglas Gregor#include "TypeLocBuilder.h"
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
38781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema;
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
69670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
709151c11836f5fbb36cedfe4d22df7e00e77a1d42Douglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
7643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
90577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
91577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
92577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
93d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// \brief Private RAII object that helps us forget and then re-remember
94d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// the template argument corresponding to a partially-substituted parameter
95d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// pack.
96d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  class ForgetPartiallySubstitutedPackRAII {
97d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    Derived &Self;
98d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    TemplateArgument Old;
99d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
100d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  public:
101d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
102d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      Old = Self.ForgetPartiallySubstitutedPack();
103d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    }
104d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
105d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    ~ForgetPartiallySubstitutedPackRAII() {
106d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      Self.RememberPartiallySubstitutedPack(Old);
107d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    }
108d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  };
109d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
1128491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
115b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
12560d7b3a319d84d688752be3870615ac0f111fb16John McCall  static inline ExprResult Owned(Expr *E) { return E; }
12660d7b3a319d84d688752be3870615ac0f111fb16John McCall  static inline StmtResult Owned(Stmt *S) { return S; }
1279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
137577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
139577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
141577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, returns no source-location information. Subclasses can
143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
148577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
153577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  DeclarationName Entity) : Self(Self) {
171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
173ae201f75e56f33278b2d48396b35bfa74c32af63Douglas Gregor
174ae201f75e56f33278b2d48396b35bfa74c32af63Douglas Gregor      if (Location.isValid())
175ae201f75e56f33278b2d48396b35bfa74c32af63Douglas Gregor        Self.getDerived().setBase(Location, Entity);
176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determine whether the given type \p T has already been
184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
1871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// to short-circuit evaluation when it is known that a given type will
188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1946eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// \brief Determine whether the given call argument should be dropped, e.g.,
1956eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// because it is a default argument.
1966eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  ///
1976eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// Subclasses can provide an alternative implementation of this routine to
1986eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// determine which kinds of call arguments get dropped. By default,
1996eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// CXXDefaultArgument nodes are dropped (prior to transformation).
2006eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  bool DropCallArgument(Expr *E) {
2016eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    return E->isDefaultArgument();
2026eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  }
203c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2048491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \brief Determine whether we should expand a pack expansion with the
2058491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// given set of parameter packs into separate arguments by repeatedly
2068491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// transforming the pattern.
2078491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
208b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor  /// By default, the transformer never tries to expand pack expansions.
2098491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// Subclasses can override this routine to provide different behavior.
2108491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
2118491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \param EllipsisLoc The location of the ellipsis that identifies the
2128491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// pack expansion.
2138491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
2148491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \param PatternRange The source range that covers the entire pattern of
2158491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// the pack expansion.
2168491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
2178491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \param Unexpanded The set of unexpanded parameter packs within the
2188491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// pattern.
2198491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
2208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \param NumUnexpanded The number of unexpanded parameter packs in
2218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \p Unexpanded.
2228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
2238491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \param ShouldExpand Will be set to \c true if the transformer should
2248491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// expand the corresponding pack expansions into separate arguments. When
2258491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// set, \c NumExpansions must also be set.
2268491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
227d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// \param RetainExpansion Whether the caller should add an unexpanded
228d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// pack expansion after all of the expanded arguments. This is used
229d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// when extending explicitly-specified template argument packs per
230d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// C++0x [temp.arg.explicit]p9.
231d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  ///
2328491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \param NumExpansions The number of separate arguments that will be in
233cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  /// the expanded form of the corresponding pack expansion. This is both an
234cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  /// input and an output parameter, which can be set by the caller if the
235cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  /// number of expansions is known a priori (e.g., due to a prior substitution)
236cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  /// and will be set by the callee when the number of expansions is known.
237cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  /// The callee must set this value when \c ShouldExpand is \c true; it may
238cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  /// set this value in other cases.
2398491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
2408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \returns true if an error occurred (e.g., because the parameter packs
2418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// are to be instantiated with arguments of different lengths), false
2428491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
2438491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// must be set.
2448491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
2458491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                               SourceRange PatternRange,
2468491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                               const UnexpandedParameterPack *Unexpanded,
2478491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                               unsigned NumUnexpanded,
2488491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                               bool &ShouldExpand,
249d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                               bool &RetainExpansion,
250cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                               llvm::Optional<unsigned> &NumExpansions) {
2518491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    ShouldExpand = false;
2528491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    return false;
2538491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  }
2548491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
255d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// \brief "Forget" about the partially-substituted pack template argument,
256d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// when performing an instantiation that must preserve the parameter pack
257d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// use.
258d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  ///
259d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// This routine is meant to be overridden by the template instantiator.
260d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  TemplateArgument ForgetPartiallySubstitutedPack() {
261d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    return TemplateArgument();
262d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  }
263d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
264d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// \brief "Remember" the partially-substituted pack template argument
265d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// after performing an instantiation that must preserve the parameter pack
266d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// use.
267d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  ///
268d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  /// This routine is meant to be overridden by the template instantiator.
269d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
270d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
27112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor  /// \brief Note to the derived class when a function parameter pack is
27212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor  /// being expanded.
27312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor  void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
27412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor
275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by creating a
278a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// TypeSourceInfo for it and delegating to the appropriate
279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// function.  This is expensive, but we don't mind, because
280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// this method is deprecated anyway;  all users should be
281a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// switched to storing TypeSourceInfos.
282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
28443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType TransformType(QualType T);
2851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transforms the given type-with-location into a new
287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type-with-location.
288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ///
289a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by delegating to the
290a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// appropriate TransformXXXType to build a new type.  Subclasses
291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// may override this function (to take over all type
292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// transformations) or some set of the TransformXXXType functions
293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// to alter the transformation.
29443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TypeSourceInfo *TransformType(TypeSourceInfo *DI);
295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
30043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
302657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
30543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
30643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
30743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
30843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
30943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
31043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
31160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TransformStmt(Stmt *S);
3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
313657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
314657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
32160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult TransformExpr(Expr *E);
3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
323aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \brief Transform the given list of expressions.
324aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  ///
325aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// This routine transforms a list of expressions by invoking
326aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \c TransformExpr() for each subexpression. However, it also provides
327aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// support for variadic templates by expanding any pack expansions (if the
328aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// derived class permits such expansion) along the way. When pack expansions
329aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// are present, the number of outputs may not equal the number of inputs.
330aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  ///
331aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \param Inputs The set of expressions to be transformed.
332aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  ///
333aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \param NumInputs The number of expressions in \c Inputs.
334aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  ///
335aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \param IsCall If \c true, then this transform is being performed on
336aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// function-call arguments, and any arguments that should be dropped, will
337aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// be.
338aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  ///
339aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \param Outputs The transformed input expressions will be added to this
340aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// vector.
341aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  ///
342aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
343aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// due to transformation.
344aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  ///
345aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  /// \returns true if an error occurred, false otherwise.
346aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall,
347aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                      llvm::SmallVectorImpl<Expr *> &Outputs,
348aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                      bool *ArgChanged = 0);
349aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
353dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
354dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
3557c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
35643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
35743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
35843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
36043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
361c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
362c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().TransformDecl(Loc, D);
3637c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  }
3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3656cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
3666cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
3676cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
368c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// This specific declaration transformation only applies to the first
3696cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
3706cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
3716cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
3726cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
3736cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
374c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
375c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
3766cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
377c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
378c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// \brief Transform the given nested-name-specifier with source-location
379c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// information.
380c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  ///
381c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// By default, transforms all of the types and declarations within the
382c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
383c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// alternate behavior.
384c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  NestedNameSpecifierLoc TransformNestedNameSpecifierLoc(
385c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                    NestedNameSpecifierLoc NNS,
386c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                          QualType ObjectType = QualType(),
387c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
388c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
38981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
39081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
39181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
39281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
39381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
39481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
3952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo
39643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
400fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param SS The nested-name-specifier that qualifies the template
401fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// name. This nested-name-specifier must already have been transformed.
402fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
403fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param Name The template name to transform.
404fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
405fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param NameLoc The source location of the template name.
406fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
407fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param ObjectType If we're translating a template name within a member
408fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// access expression, this is the type of the object whose member template
409fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// is being referenced.
410fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
411fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param FirstQualifierInScope If the first part of a nested-name-specifier
412fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// also refers to a name within the current (lexical) scope, this is the
413fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// declaration it refers to.
414fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
415fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// By default, transforms the template name by transforming the declarations
416fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// and nested-name-specifiers that occur within the template name.
417fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
418fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName TransformTemplateName(CXXScopeSpec &SS,
419fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                     TemplateName Name,
420fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                     SourceLocation NameLoc,
421fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                     QualType ObjectType = QualType(),
422fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                     NamedDecl *FirstQualifierInScope = 0);
423fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
428670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
429670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
430833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
431833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
432833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
433833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
434833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
435fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// \brief Transform the given set of template arguments.
436fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
437fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// By default, this operation transforms all of the template arguments
438fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// in the input set using \c TransformTemplateArgument(), and appends
439fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// the transformed arguments to the output list.
440fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
4417ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// Note that this overload of \c TransformTemplateArguments() is merely
4427ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// a convenience function. Subclasses that wish to override this behavior
4437ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// should override the iterator-based member template version.
4447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  ///
445fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// \param Inputs The set of template arguments to be transformed.
446fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
447fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// \param NumInputs The number of template arguments in \p Inputs.
448fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
449fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// \param Outputs The set of transformed template arguments output by this
450fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// routine.
451fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
452fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// Returns true if an error occurred.
453fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
454fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                  unsigned NumInputs,
4557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                  TemplateArgumentListInfo &Outputs) {
4567ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs);
4577ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
4587f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
4597f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// \brief Transform the given set of template arguments.
4607f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  ///
4617f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// By default, this operation transforms all of the template arguments
4627f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// in the input set using \c TransformTemplateArgument(), and appends
4637f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// the transformed arguments to the output list.
4647f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  ///
4657ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// \param First An iterator to the first template argument.
4667ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  ///
4677ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// \param Last An iterator one step past the last template argument.
4687f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  ///
4697f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// \param Outputs The set of transformed template arguments output by this
4707f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// routine.
4717f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  ///
4727f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// Returns true if an error occurred.
4737ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  template<typename InputIterator>
4747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  bool TransformTemplateArguments(InputIterator First,
4757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                  InputIterator Last,
4767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                  TemplateArgumentListInfo &Outputs);
4777f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
478833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
479833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
480833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
481833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
482a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// \brief Fakes up a TypeSourceInfo for a type.
483a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
484a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return SemaRef.Context.getTrivialTypeSourceInfo(T,
485833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
486833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
488a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
489a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
49043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
49343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType
49443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TransformTemplateSpecializationType(TypeLocBuilder &TLB,
49543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                      TemplateSpecializationTypeLoc TL,
49643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                      TemplateName Template);
49743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
49843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType
49943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
50043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                      DependentTemplateSpecializationTypeLoc TL,
501087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor                                               TemplateName Template,
502087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor                                               CXXScopeSpec &SS);
503a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
504a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  QualType
505a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
50694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                               DependentTemplateSpecializationTypeLoc TL,
50794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                         NestedNameSpecifierLoc QualifierLoc);
50894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
50921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms the parameters of a function type into the
51021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// given vectors.
51121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
51221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// The result vectors should be kept in sync; null entries in the
51321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// variables vector are acceptable.
51421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
51521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// Return true on error.
516a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor  bool TransformFunctionTypeParams(SourceLocation Loc,
517a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                   ParmVarDecl **Params, unsigned NumParams,
518a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                   const QualType *ParamTypes,
51921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<QualType> &PTypes,
520a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                   llvm::SmallVectorImpl<ParmVarDecl*> *PVars);
52121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
52221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms a single function-type parameter.  Return null
52321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// on error.
5246a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
5256a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                        llvm::Optional<unsigned> NumExpansions);
52621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
52743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
528833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
52960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
53060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
53360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Transform##Node(Node *S);
534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
53560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Transform##Node(Node *E);
5367381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
5374bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
5381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
54385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
5471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
54985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
55185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
55385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
55485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
55585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
55785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
55885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
55985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
56085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
56185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
5621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
56885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
56985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
5771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
5841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
5901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
59385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
59485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
60385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
60485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
6139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SizeExpr,
614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
6249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *SizeExpr,
625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
63382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
634e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                             VectorType::VectorKind VecKind);
6351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
6431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
6509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *SizeExpr,
651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
660fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    bool Variadic, unsigned Quals,
661c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                    RefQualifierKind RefQualifier,
662fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    const FunctionType::ExtInfo &Info);
6631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
665a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
667ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// \brief Rebuild an unresolved typename type, given the decl that
668ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// the UnresolvedUsingTypenameDecl was transformed to.
669ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType RebuildUnresolvedUsingType(Decl *D);
670ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
6857da2431c23ef1ee8acb114e39692246e1801afc2John McCall
6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
687577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
688577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6902a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
691577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
693577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
694577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
699577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7012a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
7021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70334b41d939a1328f484511c6002ba2456db879a29Richard Smith  /// \brief Build a new C++0x auto type.
70434b41d939a1328f484511c6002ba2456db879a29Richard Smith  ///
70534b41d939a1328f484511c6002ba2456db879a29Richard Smith  /// By default, builds a new AutoType with the given deduced type.
70634b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType RebuildAutoType(QualType Deduced) {
70734b41d939a1328f484511c6002ba2456db879a29Richard Smith    return SemaRef.Context.getAutoType(Deduced);
70834b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
70934b41d939a1328f484511c6002ba2456db879a29Richard Smith
710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
716833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
71767714230a191bc3c01f33378f34f34ef377991a6Douglas Gregor                                             TemplateArgumentListInfo &Args);
7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
719075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  /// \brief Build a new parenthesized type.
720075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ///
721075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  /// By default, builds a new ParenType type from the inner type.
722075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  /// Subclasses may override this routine to provide different behavior.
723075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType RebuildParenType(QualType InnerType) {
724075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return SemaRef.Context.getParenType(InnerType);
725075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
726075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
727577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
728577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
729465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// By default, builds a new ElaboratedType type from the keyword,
730465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// the nested-name-specifier and the named type.
731465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// Subclasses may override this routine to provide different behavior.
73221e413fe6305a198564d436ac515497716c47844John McCall  QualType RebuildElaboratedType(SourceLocation KeywordLoc,
73321e413fe6305a198564d436ac515497716c47844John McCall                                 ElaboratedTypeKeyword Keyword,
7349e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                 NestedNameSpecifierLoc QualifierLoc,
7359e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                 QualType Named) {
7369e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    return SemaRef.Context.getElaboratedType(Keyword,
7379e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                         QualifierLoc.getNestedNameSpecifier(),
7389e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                             Named);
7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
740577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
742577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
743e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// By default, builds a new DependentNameType type from the
744e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// nested-name-specifier and the given type. Subclasses may override
745e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// this routine to provide different behavior.
74633500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType RebuildDependentTemplateSpecializationType(
74794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          ElaboratedTypeKeyword Keyword,
74894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          NestedNameSpecifierLoc QualifierLoc,
74994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          const IdentifierInfo *Name,
75094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          SourceLocation NameLoc,
75167714230a191bc3c01f33378f34f34ef377991a6Douglas Gregor                                          TemplateArgumentListInfo &Args) {
75294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // Rebuild the template name.
75394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // TODO: avoid TemplateName abstraction
754fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    CXXScopeSpec SS;
755fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    SS.Adopt(QualifierLoc);
75694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    TemplateName InstName
757fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 0);
75894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
75994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (InstName.isNull())
76094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      return QualType();
76194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
76294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // If it's still dependent, make a dependent specialization.
76394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (InstName.getAsDependentTemplateName())
76494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
76594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          QualifierLoc.getNestedNameSpecifier(),
76694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                                    Name,
76794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                                    Args);
76894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
76994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // Otherwise, make an elaborated type wrapping a non-dependent
77094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // specialization.
77194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    QualType T =
77294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
77394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (T.isNull()) return QualType();
77494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
77594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == 0)
77694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      return T;
77794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
77894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    return SemaRef.Context.getElaboratedType(Keyword,
77994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                       QualifierLoc.getNestedNameSpecifier(),
78094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                             T);
78194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  }
78294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
783577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
785577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
786e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// (or elaborated type). Subclasses may override this routine to provide
787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
788e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
789e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation KeywordLoc,
7902494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                    NestedNameSpecifierLoc QualifierLoc,
7912494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                    const IdentifierInfo *Id,
792e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation IdLoc) {
7934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    CXXScopeSpec SS;
7942494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    SS.Adopt(QualifierLoc);
795e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara
7962494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
7974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      // If the name is still dependent, just build a new dependent name type.
7984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
7992494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor        return SemaRef.Context.getDependentNameType(Keyword,
8002494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                          QualifierLoc.getNestedNameSpecifier(),
8012494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                                    Id);
8024033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
8034033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
804465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (Keyword == ETK_None || Keyword == ETK_Typename)
8052494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor      return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
806e29425bd22fbb9200bbec7b743197b9c6dad3e40Douglas Gregor                                       *Id, IdLoc);
807465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
808465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
809465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
810e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    // We had a dependent elaborated-type-specifier that has been transformed
8114033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // into a non-dependent elaborated-type-specifier. Find the tag we're
8124033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // referring to.
813e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
8144033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
8154033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!DC)
8164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
8174033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
8185613876991c80a684595fe8de1f039296a0657ffJohn McCall    if (SemaRef.RequireCompleteDeclContext(SS, DC))
8195613876991c80a684595fe8de1f039296a0657ffJohn McCall      return QualType();
8205613876991c80a684595fe8de1f039296a0657ffJohn McCall
8214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    TagDecl *Tag = 0;
8224033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SemaRef.LookupQualifiedName(Result, DC);
8234033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    switch (Result.getResultKind()) {
8244033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFound:
8254033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFoundInCurrentInstantiation:
8264033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
827c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8284033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Found:
8294033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        Tag = Result.getAsSingle<TagDecl>();
8304033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
831c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8324033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundOverloaded:
8334033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundUnresolvedValue:
8344033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        llvm_unreachable("Tag lookup cannot find non-tags");
8354033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
836c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8374033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Ambiguous:
8384033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        // Let the LookupResult structure handle ambiguities.
8394033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
8404033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
8414033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
8424033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!Tag) {
843446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      // Check where the name exists but isn't a tag type and use that to emit
844446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      // better diagnostics.
845446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
846446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      SemaRef.LookupQualifiedName(Result, DC);
847446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      switch (Result.getResultKind()) {
848446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky        case LookupResult::Found:
849446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky        case LookupResult::FoundOverloaded:
850446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky        case LookupResult::FoundUnresolvedValue: {
851446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky	  NamedDecl *SomeDecl = Result.getRepresentativeDecl();
852446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          unsigned Kind = 0;
853446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
854446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 2;
855446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
856446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
857446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          break;
858446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky	}
859446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky        default:
860446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          // FIXME: Would be nice to highlight just the source range.
861446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
862446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky            << Kind << Id << DC;
863446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          break;
864446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      }
8654033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
8664033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
867465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
868e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) {
869e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
8704033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
8714033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
8724033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
8734033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
8744033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // Build the elaborated-type-specifier type.
8754033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    QualType T = SemaRef.Context.getTypeDeclType(Tag);
8762494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    return SemaRef.Context.getElaboratedType(Keyword,
8772494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                         QualifierLoc.getNestedNameSpecifier(),
8782494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                             T);
879dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8812fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  /// \brief Build a new pack expansion type.
8822fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  ///
8832fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  /// By default, builds a new PackExpansionType type from the given pattern.
8842fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
8852fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  QualType RebuildPackExpansionType(QualType Pattern,
8862fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor                                    SourceRange PatternRange,
887cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                    SourceLocation EllipsisLoc,
888cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                    llvm::Optional<unsigned> NumExpansions) {
889cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
890cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                        NumExpansions);
8912fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  }
8922fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
893d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
894d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
895d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
896d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
897d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
898d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
899fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName RebuildTemplateName(CXXScopeSpec &SS,
900d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
901d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
902d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
903d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
904d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
905d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
906d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
907d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
908d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
909d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
910fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName RebuildTemplateName(CXXScopeSpec &SS,
911fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                   const IdentifierInfo &Name,
912fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                   SourceLocation NameLoc,
91343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                   QualType ObjectType,
91443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                   NamedDecl *FirstQualifierInScope);
9151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
916ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
917ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
918ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
919ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
920ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
921ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
922ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
923fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName RebuildTemplateName(CXXScopeSpec &SS,
924ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
925fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                   SourceLocation NameLoc,
926ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
9271aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
9281aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Build a new template name given a template template parameter pack
9291aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// and the
9301aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ///
9311aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
9321aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
9331aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// template name. Subclasses may override this routine to provide different
9341aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// behavior.
9351aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
9361aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                   const TemplateArgument &ArgPack) {
9371aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
9381aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
9391aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
94043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
94143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
94243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
94343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
94460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
94543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
94643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
94743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
9489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
94943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
95043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
95143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
95243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
95343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
95443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
95543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
95660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
9579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *LHS,
95843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
9599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *RHS,
96043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
9619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
96243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
96343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
9641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
96543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
96643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
96743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
96843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
96960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
9709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().ActOnCaseStmtBody(S, Body);
9719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return S;
97243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
9731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
97443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
97543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
97643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
97743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
97860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
97943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
9809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      Stmt *SubStmt) {
9819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
98243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
98343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
9841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
98643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
98743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
98843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
98957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
99057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                              SourceLocation ColonLoc, Stmt *SubStmt) {
99157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
99243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
9931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
99543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
99643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
99743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
99860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
99957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                           VarDecl *CondVar, Stmt *Then,
100057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                           SourceLocation ElseLoc, Stmt *Else) {
100144aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis    return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
100243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
100543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
100860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
100957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                    Expr *Cond, VarDecl *CondVar) {
10109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
1011d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                            CondVar);
101243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
101443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
101543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
101643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
101743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
101860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
101957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                   Stmt *Switch, Stmt *Body) {
10209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
102143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
102243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
102343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
102443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
102543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
102643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
102757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond,
102857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                              VarDecl *CondVar, Stmt *Body) {
10299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
103043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
103243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
103343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
103443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
103543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
103660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1037ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                           SourceLocation WhileLoc, SourceLocation LParenLoc,
1038ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                           Expr *Cond, SourceLocation RParenLoc) {
10399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
10409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 Cond, RParenLoc);
104143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
104243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
104343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
104443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
104543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
104643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1047ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1048ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                            Stmt *Init, Sema::FullExprArg Cond,
1049ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                            VarDecl *CondVar, Sema::FullExprArg Inc,
1050ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                            SourceLocation RParenLoc, Stmt *Body) {
10519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1052ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                                  CondVar, Inc, RParenLoc, Body);
105343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
105543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
105643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
105743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
105843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1059ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1060ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                             LabelDecl *Label) {
106157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
106243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
106343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
106443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
106543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
106643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
106743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
106860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1069ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                                     SourceLocation StarLoc,
1070ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                                     Expr *Target) {
10719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
107243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
107443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
107543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
107643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
107743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1078ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
10799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnReturnStmt(ReturnLoc, Result);
108043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
108243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
108343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
108443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
108543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
108660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
108843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
1089406c38e8c1f105acfd438f94dfbc17af817aa4a5Richard Smith    Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls, NumDecls);
1090406c38e8c1f105acfd438f94dfbc17af817aa4a5Richard Smith    return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
109143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1093703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
1094703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
1095703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
1096703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
109760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildAsmStmt(SourceLocation AsmLoc,
1098703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
1099703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
1100703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
1101703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
1102ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
1103703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
1104703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
11059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Expr *AsmString,
1106703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
1107703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
1108703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
1109c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1110703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
11119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Exprs, AsmString, Clobbers,
1112703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
1113703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
11144dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
11154dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @try statement.
11164dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
11174dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
11184dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
111960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
11209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *TryBody,
11218f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                        MultiStmtArg CatchStmts,
11229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *Finally) {
11239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts),
11249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Finally);
11254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
11264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
1127be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Rebuild an Objective-C exception declaration.
1128be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
1129be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new declaration.
1130be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1131be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1132be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                    TypeSourceInfo *TInfo, QualType T) {
1133c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildObjCExceptionDecl(TInfo, T,
1134c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                            ExceptionDecl->getIdentifier(),
1135be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                            ExceptionDecl->getLocation());
1136be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
1137c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1138be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Build a new Objective-C @catch statement.
1139be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
1140be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
1141be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
114260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1143be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          SourceLocation RParenLoc,
1144be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          VarDecl *Var,
11459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Stmt *Body) {
1146be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
11479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Var, Body);
1148be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
1149c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
11504dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @finally statement.
11514dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
11524dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
11534dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
115460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
11559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Stmt *Body) {
11569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
11574dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
1158c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
11598fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @throw statement.
1160d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  ///
1161d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
1162d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
116360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
11649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *Operand) {
11659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1166d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
1167c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
11688fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @synchronized statement.
11698fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  ///
11708fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
11718fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
117260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
11739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *Object,
11749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Stmt *Body) {
11759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object,
11769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Body);
11778fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  }
1178c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor
1179c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// \brief Build a new Objective-C fast enumeration statement.
1180c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  ///
1181c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
1182c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
118360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1184f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          SourceLocation LParenLoc,
1185f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Stmt *Element,
1186f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Expr *Collection,
1187f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          SourceLocation RParenLoc,
1188f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Stmt *Body) {
1189c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
11909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Element,
11919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Collection,
1192c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                RParenLoc,
11939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Body);
1194c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  }
1195c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
119643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
119743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
119843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
119943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
120083cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1201a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
120243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
120383cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor                                SourceLocation Loc) {
120483cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor    return getSema().BuildExceptionDeclaration(0, Declarator, Name, Loc);
120543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
120643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
120743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
120843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
120943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
121043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
121160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1212f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                 VarDecl *ExceptionDecl,
1213f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                 Stmt *Handler) {
12149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
12159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Handler));
121643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
121843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
121943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
122043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
122143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
122260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
1223f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                               Stmt *TryBlock,
1224f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                               MultiStmtArg Handlers) {
12259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers));
122643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
123260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1233f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                        LookupResult &R,
1234f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                        bool RequiresADL) {
1235f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1236f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
1237f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1238f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1239f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
1240f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
1241f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
1242f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
124340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1244f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                ValueDecl *VD,
1245f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                const DeclarationNameInfo &NameInfo,
1246f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                TemplateArgumentListInfo *TemplateArgs) {
1247a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
124840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    SS.Adopt(QualifierLoc);
1249dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
1250dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
12512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
12522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
125960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
12619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1264a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
12651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1266a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1267a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
126860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1269f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            SourceLocation OperatorLoc,
1270f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            bool isArrow,
1271f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            CXXScopeSpec &SS,
1272f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            TypeSourceInfo *ScopeType,
1273f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            SourceLocation CCLoc,
1274f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            SourceLocation TildeLoc,
1275a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
12761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
12781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
128160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
12822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                        UnaryOperatorKind Opc,
12839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *SubExpr) {
12849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr);
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Build a new builtin offsetof expression.
12888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ///
12898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
12908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
129160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
12928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       TypeSourceInfo *Type,
1293f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                       Sema::OffsetOfComponent *Components,
12948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       unsigned NumComponents,
12958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       SourceLocation RParenLoc) {
12968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
12978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          NumComponents, RParenLoc);
12988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1299c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
13011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
130460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
13055ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
1307a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
13101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
131560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildSizeOfAlignOf(Expr *SubExpr, SourceLocation OpLoc,
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
131760d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
13189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      = getSema().CreateSizeOfAlignOfExpr(SubExpr, OpLoc, isSizeOf, R);
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1320f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
132960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
13319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *RHS,
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
13339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS,
13349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             LBracketLoc, RHS,
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
13391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
134260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
1344e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                   SourceLocation RParenLoc,
1345e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                   Expr *ExecConfig = 0) {
13469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc,
1347e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                   move(Args), RParenLoc, ExecConfig);
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
13511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
135460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
1355f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               bool isArrow,
135640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                               NestedNameSpecifierLoc QualifierLoc,
1357f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               const DeclarationNameInfo &MemberNameInfo,
1358f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               ValueDecl *Member,
1359f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               NamedDecl *FoundDecl,
1360d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
1361f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               NamedDecl *FirstQualifierInScope) {
1362d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
1363f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      // We have a reference to an unnamed field.  This is always the
1364f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      // base of an anonymous struct/union member access, i.e. the
1365f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      // field is always of record type.
136640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
1367f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      assert(Member->getType()->isRecordType() &&
1368f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall             "unnamed member not of record type?");
13691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
137040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      if (getSema().PerformObjectMemberConversion(Base,
137140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                                        QualifierLoc.getNestedNameSpecifier(),
13726bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                                  FoundDecl, Member))
1373f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
13748aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
1375f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
13761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
13779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        new (getSema().Context) MemberExpr(Base, isArrow,
13782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                           Member, MemberNameInfo,
1379f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                           cast<FieldDecl>(Member)->getType(),
1380f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                           VK, OK_Ordinary);
1381d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
1382d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
13831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
138483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
138540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    SS.Adopt(QualifierLoc);
138683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
13879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().DefaultFunctionArrayConversion(Base);
13889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    QualType BaseType = Base->getType();
1389aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
13906bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // FIXME: this involves duplicating earlier analysis in a lot of
13916bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // cases; we should avoid this when possible.
13922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
13936bb8017bb9e828d118e15e59d71c66bba323c364John McCall    R.addDecl(FoundDecl);
1394c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1395c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
13969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1397129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1398c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
140560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
14062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                         BinaryOperatorKind Opc,
14079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *LHS, Expr *RHS) {
14089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS);
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
14121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
141560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildConditionalOperator(Expr *Cond,
141656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                        SourceLocation QuestionLoc,
141756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                        Expr *LHS,
141856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                        SourceLocation ColonLoc,
141956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                        Expr *RHS) {
14209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
14219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        LHS, RHS);
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
14251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
142860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
14299d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
14319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *SubExpr) {
1432b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
14339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubExpr);
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
14371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
144060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
144142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
14439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Init) {
144442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
14459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Init);
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
14491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
145260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildExtVectorElementExpr(Expr *Base,
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1456aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1457129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
14582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
14599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1460129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1461129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
14622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                              NameInfo,
1463129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
14671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
147060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildInitList(SourceLocation LBraceLoc,
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1472e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1473e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
147460d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
1475e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1476e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1477e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1478c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1479e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1480e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1481e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1482e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1483e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
14871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
149060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
14949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *Init) {
149560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
14979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Init);
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1499f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
15001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
15061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
151060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildImplicitValueInitExpr(QualType T) {
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
15151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
151860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
15199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SubExpr, TypeSourceInfo *TInfo,
15202cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    SourceLocation RParenLoc) {
15212cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara    return getSema().BuildVAArgExpr(BuiltinLoc,
15229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    SubExpr, TInfo,
15232cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    RParenLoc);
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
15271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
153060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1533c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1534f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
15391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
154260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1543ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                                  SourceLocation LabelLoc, LabelDecl *Label) {
154457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
15481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
155160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
15529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Stmt *SubStmt,
1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
15549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
156160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
15629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *Cond, Expr *LHS, Expr *RHS,
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
15659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Cond, LHS, RHS,
1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
15741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
157760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
15799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Callee,
15809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *First,
15819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Second);
15821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
158960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
15929d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
15959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
15999d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
16001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
16019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
16049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
16069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    SubExpr, RParenLoc);
16071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
16099d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
16101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
16119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                        SubExpr,
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
16131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
16159d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
16161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
16179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
16181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
16231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1624f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
163160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
16339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
16369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Expr *SubExpr,
1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1638c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
16399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1640c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1641c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
164860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
16509d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
16539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *SubExpr,
1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1655c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
16569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1657c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1658c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
166560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
16679d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
16709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SubExpr,
1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1672c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
16739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1674c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1675c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
168260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
16849d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
16879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1689c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
16909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1691c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1692c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1699ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
1700ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          SourceLocation LParenLoc,
1701ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          Expr *Sub,
1702ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          SourceLocation RParenLoc) {
1703ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
1704f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                               MultiExprArg(&Sub, 1),
1705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
171260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
171357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
171457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        TypeSourceInfo *Operand,
1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1716c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
171757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
172001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
1721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
172560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
172657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
17279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand,
1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
17299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
173057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
173301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// \brief Build a new C++ __uuidof(type) expression.
173401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ///
173501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// By default, performs semantic analysis to build the new expression.
173601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// Subclasses may override this routine to provide different behavior.
173701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
173801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        SourceLocation TypeidLoc,
173901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        TypeSourceInfo *Operand,
174001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        SourceLocation RParenLoc) {
174101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
174201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                    RParenLoc);
174301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
174401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
174501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// \brief Build a new C++ __uuidof(expr) expression.
174601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ///
174701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// By default, performs semantic analysis to build the new expression.
174801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// Subclasses may override this routine to provide different behavior.
174901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
175001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        SourceLocation TypeidLoc,
175101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        Expr *Operand,
175201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        SourceLocation RParenLoc) {
175301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
175401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                    RParenLoc);
175501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
175601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
1757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
176260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1763ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor                                QualType ThisType,
1764ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor                                bool isImplicit) {
1765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1766828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1767828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
177460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub) {
17759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXThrow(ThrowLoc, Sub);
1776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
178360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1784036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1785036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1786036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1793ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
1794ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation LParenLoc,
1795ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation RParenLoc) {
1796ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
17971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1798ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               RParenLoc);
1799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
18001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
180560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
18061bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               bool UseGlobal,
18071bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation PlacementLParen,
18081bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               MultiExprArg PlacementArgs,
18091bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation PlacementRParen,
18101bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceRange TypeIdParens,
18111bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               QualType AllocatedType,
18121bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               TypeSourceInfo *AllocatedTypeInfo,
18131bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               Expr *ArraySize,
18141bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation ConstructorLParen,
18151bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               MultiExprArg ConstructorArgs,
18161bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation ConstructorRParen) {
18171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
18214bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                 TypeIdParens,
18221bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                 AllocatedType,
18231bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                 AllocatedTypeInfo,
18249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 ArraySize,
1825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
183460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
18379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand) {
1838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
18399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Operand);
1840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
18411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
184660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
18473d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor                                   SourceLocation StartLoc,
18483d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor                                   TypeSourceInfo *T,
18493d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor                                   SourceLocation RParenLoc) {
18503d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor    return getSema().BuildUnaryTypeTrait(Trait, StartLoc, T, RParenLoc);
1851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
18536ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  /// \brief Build a new binary type trait expression.
18546ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  ///
18556ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  /// By default, performs semantic analysis to build the new expression.
18566ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  /// Subclasses may override this routine to provide different behavior.
18576ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  ExprResult RebuildBinaryTypeTrait(BinaryTypeTrait Trait,
18586ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                    SourceLocation StartLoc,
18596ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                    TypeSourceInfo *LhsT,
18606ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                    TypeSourceInfo *RhsT,
18616ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                    SourceLocation RParenLoc) {
18626ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc);
18636ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  }
18646ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
18651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
187000cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  ExprResult RebuildDependentScopeDeclRefExpr(
187100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor                                          NestedNameSpecifierLoc QualifierLoc,
18722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                       const DeclarationNameInfo &NameInfo,
1873f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
187500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor    SS.Adopt(QualifierLoc);
1876f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1877f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
18782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo,
1879f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1880f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
18812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo);
1882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
188860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1889f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1890f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1891d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1892f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
189960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXConstructExpr(QualType T,
19004411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
19038c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           MultiExprArg Args,
19048c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           bool RequiresZeroInit,
1905428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                             CXXConstructExpr::ConstructionKind ConstructKind,
1906428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                           SourceRange ParenRange) {
1907ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> ConvertedArgs(SemaRef);
1908c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
19094411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
1910f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
1911c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
19124411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
19138c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           move_arg(ConvertedArgs),
1914428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                           RequiresZeroInit, ConstructKind,
1915428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                           ParenRange);
1916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1922ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
1923ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation LParenLoc,
1924ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           MultiExprArg Args,
1925ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation RParenLoc) {
1926ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo,
1927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1936ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
1937ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               SourceLocation LParenLoc,
1938ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               MultiExprArg Args,
1939ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               SourceLocation RParenLoc) {
1940ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo,
1941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
19451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
195060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
19517c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                QualType BaseType,
19527c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                bool IsArrow,
19537c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                SourceLocation OperatorLoc,
19547c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                          NestedNameSpecifierLoc QualifierLoc,
1955129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
19562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                   const DeclarationNameInfo &MemberNameInfo,
1957129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
19597c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    SS.Adopt(QualifierLoc);
19601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
1962aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1963129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
19642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            MemberNameInfo,
19652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            TemplateArgs);
1966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1968129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
19693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
19703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
19713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
197260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE,
1973aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1974129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1975129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
19764c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                                           NestedNameSpecifierLoc QualifierLoc,
1977c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1978129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1979129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
19803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
19814c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    SS.Adopt(QualifierLoc);
19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
1984aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1985c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1986c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
19873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
19881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19892e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  /// \brief Build a new noexcept expression.
19902e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  ///
19912e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  /// By default, performs semantic analysis to build the new expression.
19922e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  /// Subclasses may override this routine to provide different behavior.
19932e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
19942e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl    return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
19952e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  }
19962e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
1997ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  /// \brief Build a new expression to compute the length of a parameter pack.
1998ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
1999ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                   SourceLocation PackLoc,
2000ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                   SourceLocation RParenLoc,
2001ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                   unsigned Length) {
2002ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2003ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                                OperatorLoc, Pack, PackLoc,
2004ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                                RParenLoc, Length);
2005ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  }
2006ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
2007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
2008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
2009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
2010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
201160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
201281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                         TypeSourceInfo *EncodeTypeInfo,
2013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
201481d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
2015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
20161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
2017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
201892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C class message.
201960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
202092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
2021f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                          SourceLocation SelectorLoc,
202292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
2023c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
202492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
202592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
202692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
202792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     ReceiverTypeInfo->getType(),
202892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     /*SuperLoc=*/SourceLocation(),
2029f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                     Sel, Method, LBracLoc, SelectorLoc,
2030f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                     RBracLoc, move(Args));
203192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
203292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
203392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C instance message.
203460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCMessageExpr(Expr *Receiver,
203592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
2036f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                          SourceLocation SelectorLoc,
203792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
2038c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
203992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
204092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
20419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildInstanceMessage(Receiver,
20429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Receiver->getType(),
204392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        /*SuperLoc=*/SourceLocation(),
2044f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                        Sel, Method, LBracLoc, SelectorLoc,
2045f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                        RBracLoc, move(Args));
204692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
204792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
2048f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C ivar reference expression.
2049f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
2050f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
2051f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
205260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2053f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          SourceLocation IvarLoc,
2054f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          bool IsArrow, bool IsFreeIvar) {
2055f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    // FIXME: We lose track of the IsFreeIvar bit.
2056f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
20579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
2058f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
2059f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
206060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2061f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IvarLoc,
2062d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0,
2063ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
2064f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
2065f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
2066c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2067f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
2068f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
2069c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
20709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2071c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IvarLoc, IsArrow, SS,
2072f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
2073c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
2074f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
2075f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
2076e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor
2077e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// \brief Build a new Objective-C property reference expression.
2078e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  ///
2079e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
2080e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
208160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2082e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              ObjCPropertyDecl *Property,
2083e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              SourceLocation PropertyLoc) {
2084e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    CXXScopeSpec SS;
20859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
2086e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
2087e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                   Sema::LookupMemberName);
2088e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    bool IsArrow = false;
208960d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2090e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         /*FIME:*/PropertyLoc,
2091d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
2092e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.isInvalid())
2093f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
2094c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2095e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.get())
2096e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return move(Result);
2097c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
20989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2099c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/PropertyLoc, IsArrow,
2100c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              SS,
2101e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*FirstQualifierInScope=*/0,
2102c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
2103e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*TemplateArgs=*/0);
2104e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  }
2105c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
210612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  /// \brief Build a new Objective-C property reference expression.
21079cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  ///
21089cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
210912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  /// Subclasses may override this routine to provide different behavior.
211012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
211112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                        ObjCMethodDecl *Getter,
211212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                        ObjCMethodDecl *Setter,
211312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                        SourceLocation PropertyLoc) {
211412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    // Since these expressions can only be value-dependent, we do not
211512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    // need to perform semantic analysis again.
211612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    return Owned(
211712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall      new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
211812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                  VK_LValue, OK_ObjCProperty,
211912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                  PropertyLoc, Base));
21209cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  }
21219cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor
2122f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C "isa" expression.
2123f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
2124f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
2125f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
212660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2127f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                      bool IsArrow) {
2128f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
21299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
2130f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
2131f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
213260d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2133f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IsaLoc,
2134d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
2135f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
2136f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
2137c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2138f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
2139f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
2140c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
21419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2142c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IsaLoc, IsArrow, SS,
2143f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
2144c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
2145f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
2146f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
2147c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
2149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
2150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
2151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
215260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
2153f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                      MultiExprArg SubExprs,
2154f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                      SourceLocation RParenLoc) {
2155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
21561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
2157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
2158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
2159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
2160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
2163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
2165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
2166f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                          VK_LValue, BuiltinLoc);
2167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
21681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
2170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
2171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
2172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
2173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
21745291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor                                                   Builtin->getCallResultType(),
2175f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                            Expr::getValueKindForType(Builtin->getResultType()),
2176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
217760d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult OwnedCall(SemaRef.Owned(TheCall));
21781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
218060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
2181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
2182f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
21831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
21851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
2186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
218743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
21888491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \brief Build a new template argument pack expansion.
21898491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
21908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// By default, performs semantic analysis to build a new pack expansion
21918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// for a template argument. Subclasses may override this routine to provide
21928491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// different behavior.
21938491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
2194cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                           SourceLocation EllipsisLoc,
2195cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                       llvm::Optional<unsigned> NumExpansions) {
21968491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    switch (Pattern.getArgument().getKind()) {
21977a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor    case TemplateArgument::Expression: {
21987a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor      ExprResult Result
219967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor        = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
220067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                       EllipsisLoc, NumExpansions);
22017a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor      if (Result.isInvalid())
22027a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor        return TemplateArgumentLoc();
22037a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor
22047a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor      return TemplateArgumentLoc(Result.get(), Result.get());
22057a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor    }
2206dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
22078491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Template:
2208a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      return TemplateArgumentLoc(TemplateArgument(
2209a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                          Pattern.getArgument().getAsTemplate(),
22102be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                                  NumExpansions),
2211b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                 Pattern.getTemplateQualifierLoc(),
2212a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                 Pattern.getTemplateNameLoc(),
2213a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                 EllipsisLoc);
22148491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
22158491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Null:
22168491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Integral:
22178491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Declaration:
22188491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Pack:
2219a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    case TemplateArgument::TemplateExpansion:
22208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      llvm_unreachable("Pack expansion pattern has no parameter packs");
22218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
22228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Type:
22238491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      if (TypeSourceInfo *Expansion
22248491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor            = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
2225cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                           EllipsisLoc,
2226cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                           NumExpansions))
22278491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
22288491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                   Expansion);
22298491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      break;
22308491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    }
22318491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
22328491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    return TemplateArgumentLoc();
22338491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  }
22348491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
2235dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  /// \brief Build a new expression pack expansion.
2236dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  ///
2237dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  /// By default, performs semantic analysis to build a new pack expansion
2238dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  /// for an expression. Subclasses may override this routine to provide
2239dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  /// different behavior.
224067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
224167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                  llvm::Optional<unsigned> NumExpansions) {
224267fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor    return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
2243dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  }
2244dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
224543fed0de4f5bc189e45562491f83d5193eb8dac0John McCallprivate:
2246c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  TypeLoc TransformTypeInObjectScope(TypeLoc TL,
2247c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                     QualType ObjectType,
2248c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                     NamedDecl *FirstQualifierInScope,
2249c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                     CXXScopeSpec &SS);
2250b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
2251b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
2252b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                             QualType ObjectType,
2253b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                             NamedDecl *FirstQualifierInScope,
2254b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                             CXXScopeSpec &SS);
2255577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
2256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
225743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
225860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
225943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
226043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
226243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
226343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
22641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
226543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
226643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
226743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
226863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node)
226943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
22704bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
22711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
227243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
227343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
22747381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
227543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
22764bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
227743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
227860d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
227943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
2280f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
22811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take()));
228343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
22841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
22851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22863fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(S);
228743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
22881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2290670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
229160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
2293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
2294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
2296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
2297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
22987381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
2299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
2300454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
23014bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
23021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
23031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23043fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
2305657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
2306657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
2307657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
2308aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorbool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
2309aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                            unsigned NumInputs,
2310aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                            bool IsCall,
2311aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                      llvm::SmallVectorImpl<Expr *> &Outputs,
2312aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                            bool *ArgChanged) {
2313aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  for (unsigned I = 0; I != NumInputs; ++I) {
2314aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    // If requested, drop call arguments that need to be dropped.
2315aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
2316aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      if (ArgChanged)
2317aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor        *ArgChanged = true;
2318aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2319aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      break;
2320aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    }
2321aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2322dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor    if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
2323dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      Expr *Pattern = Expansion->getPattern();
2324dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2325dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2326dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
2327dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
2328dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2329dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      // Determine whether the set of unexpanded parameter packs can and should
2330dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      // be expanded.
2331dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      bool Expand = true;
2332d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      bool RetainExpansion = false;
233367fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor      llvm::Optional<unsigned> OrigNumExpansions
233467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor        = Expansion->getNumExpansions();
233567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor      llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
2336dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
2337dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor                                               Pattern->getSourceRange(),
2338dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor                                               Unexpanded.data(),
2339dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor                                               Unexpanded.size(),
2340d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               Expand, RetainExpansion,
2341d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               NumExpansions))
2342dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        return true;
2343dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2344dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      if (!Expand) {
2345dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        // The transform has determined that we should perform a simple
2346dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        // transformation on the pack expansion, producing another pack
2347dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        // expansion.
2348dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
2349dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        ExprResult OutPattern = getDerived().TransformExpr(Pattern);
2350dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (OutPattern.isInvalid())
2351dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          return true;
2352dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2353dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
235467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                                Expansion->getEllipsisLoc(),
235567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                                           NumExpansions);
2356dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (Out.isInvalid())
2357dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          return true;
2358dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2359dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (ArgChanged)
2360dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          *ArgChanged = true;
2361dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        Outputs.push_back(Out.get());
2362dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        continue;
2363dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      }
2364dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2365dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      // The transform has determined that we should perform an elementwise
2366dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      // expansion of the pattern. Do so.
2367cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      for (unsigned I = 0; I != *NumExpansions; ++I) {
2368dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
2369dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        ExprResult Out = getDerived().TransformExpr(Pattern);
2370dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (Out.isInvalid())
2371dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          return true;
2372dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
237377d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor        if (Out.get()->containsUnexpandedParameterPack()) {
237467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor          Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(),
237567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                     OrigNumExpansions);
237677d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor          if (Out.isInvalid())
237777d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor            return true;
237877d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor        }
237977d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor
2380dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (ArgChanged)
2381dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          *ArgChanged = true;
2382dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        Outputs.push_back(Out.get());
2383dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      }
2384dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2385dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      continue;
2386dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor    }
2387dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2388aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    ExprResult Result = getDerived().TransformExpr(Inputs[I]);
2389aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    if (Result.isInvalid())
2390aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      return true;
2391aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2392aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    if (Result.get() != Inputs[I] && ArgChanged)
2393aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      *ArgChanged = true;
2394aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2395aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    Outputs.push_back(Result.get());
2396aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  }
2397aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2398aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  return false;
2399aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor}
2400aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2401aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregortemplate<typename Derived>
2402c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc
2403c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorTreeTransform<Derived>::TransformNestedNameSpecifierLoc(
2404c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                    NestedNameSpecifierLoc NNS,
2405c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                     QualType ObjectType,
2406c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
2407c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  llvm::SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
2408c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
2409c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor       Qualifier = Qualifier.getPrefix())
2410c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    Qualifiers.push_back(Qualifier);
2411c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2412c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  CXXScopeSpec SS;
2413c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  while (!Qualifiers.empty()) {
2414c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
2415c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
2416c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2417c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    switch (QNNS->getKind()) {
2418c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::Identifier:
2419c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0,
2420c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              *QNNS->getAsIdentifier(),
2421c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              Q.getLocalBeginLoc(),
2422c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              Q.getLocalEndLoc(),
2423c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              ObjectType, false, SS,
2424c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              FirstQualifierInScope, false))
2425c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        return NestedNameSpecifierLoc();
2426c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2427c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      break;
2428c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2429c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::Namespace: {
2430c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      NamespaceDecl *NS
2431c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        = cast_or_null<NamespaceDecl>(
2432c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                    getDerived().TransformDecl(
2433c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                          Q.getLocalBeginLoc(),
2434c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                       QNNS->getAsNamespace()));
2435c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
2436c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      break;
2437c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    }
2438c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2439c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::NamespaceAlias: {
2440c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      NamespaceAliasDecl *Alias
2441c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        = cast_or_null<NamespaceAliasDecl>(
2442c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                      getDerived().TransformDecl(Q.getLocalBeginLoc(),
2443c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                 QNNS->getAsNamespaceAlias()));
2444c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
2445c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                Q.getLocalEndLoc());
2446c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      break;
2447c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    }
2448c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2449c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::Global:
2450c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      // There is no meaningful transformation that one could perform on the
2451c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      // global scope.
2452c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
2453c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      break;
2454c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2455c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::TypeSpecWithTemplate:
2456c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::TypeSpec: {
2457c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
2458c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              FirstQualifierInScope, SS);
2459c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2460c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      if (!TL)
2461c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        return NestedNameSpecifierLoc();
2462c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2463c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
2464c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor          (SemaRef.getLangOptions().CPlusPlus0x &&
2465c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor           TL.getType()->isEnumeralType())) {
2466c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        assert(!TL.getType().hasLocalQualifiers() &&
2467c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor               "Can't get cv-qualifiers here");
2468c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
2469c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                  Q.getLocalEndLoc());
2470c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        break;
2471c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      }
2472c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2473c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
2474c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        << TL.getType() << SS.getRange();
2475c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      return NestedNameSpecifierLoc();
2476c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    }
24777c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    }
2478c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
24797c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    // The qualifier-in-scope and object type only apply to the leftmost entity.
2480c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    FirstQualifierInScope = 0;
24817c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    ObjectType = QualType();
2482c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  }
2483c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2484c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // Don't rebuild the nested-name-specifier if we don't have to.
2485c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
2486c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      !getDerived().AlwaysRebuild())
2487c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    return NNS;
2488c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2489c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // If we can re-use the source-location data from the original
2490c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // nested-name-specifier, do so.
2491c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (SS.location_size() == NNS.getDataLength() &&
2492c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
2493c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
2494c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2495c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // Allocate new nested-name-specifier location information.
2496c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  return SS.getWithLocInContext(SemaRef.Context);
2497c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor}
2498c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2499c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename Derived>
25002577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameInfo
25012577743c5650c646fb705df01403707e94f2df04Abramo BagnaraTreeTransform<Derived>
250243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
25032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name = NameInfo.getName();
250481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
25052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return DeclarationNameInfo();
250681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
250781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
250881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
250981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
251081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
251181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
251281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
25133e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
251481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
25152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NameInfo;
25161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
251781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
251881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
251981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
25202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    TypeSourceInfo *NewTInfo;
25212577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CanQualType NewCanTy;
25222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
252343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      NewTInfo = getDerived().TransformType(OldTInfo);
252443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      if (!NewTInfo)
252543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall        return DeclarationNameInfo();
252643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
25272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
25282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    else {
25292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewTInfo = 0;
25302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
253143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      QualType NewT = getDerived().TransformType(Name.getCXXNameType());
25322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      if (NewT.isNull())
25332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        return DeclarationNameInfo();
25342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewCanTy = SemaRef.Context.getCanonicalType(NewT);
25352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
25361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName NewName
25382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
25392577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                           NewCanTy);
25402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NewNameInfo(NameInfo);
25412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setName(NewName);
25422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setNamedTypeInfo(NewTInfo);
25432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NewNameInfo;
254481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
25451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
25461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(0 && "Unknown name kind.");
25482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return DeclarationNameInfo();
254981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
255081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
255181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
25521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
2553fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
2554fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              TemplateName Name,
2555fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              SourceLocation NameLoc,
2556fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              QualType ObjectType,
2557fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              NamedDecl *FirstQualifierInScope) {
2558fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
2559fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    TemplateDecl *Template = QTN->getTemplateDecl();
2560fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    assert(Template && "qualified template name must refer to a template");
2561fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2562fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    TemplateDecl *TransTemplate
2563fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
2564fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                                              Template));
2565fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!TransTemplate)
2566fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return TemplateName();
2567fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2568fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2569fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        SS.getScopeRep() == QTN->getQualifier() &&
2570fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        TransTemplate == Template)
2571fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return Name;
2572fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2573fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
2574fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            TransTemplate);
2575fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  }
2576fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2577fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
2578fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (SS.getScopeRep()) {
2579fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      // These apply to the scope specifier, not the template.
2580fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      ObjectType = QualType();
2581fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      FirstQualifierInScope = 0;
2582fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    }
2583fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2584fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2585fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        SS.getScopeRep() == DTN->getQualifier() &&
2586fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        ObjectType.isNull())
2587fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return Name;
2588fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2589fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (DTN->isIdentifier()) {
2590fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return getDerived().RebuildTemplateName(SS,
2591fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              *DTN->getIdentifier(),
2592fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              NameLoc,
2593fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              ObjectType,
2594fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              FirstQualifierInScope);
2595fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    }
2596fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2597fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
2598fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            ObjectType);
2599fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  }
2600fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2601fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
2602fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    TemplateDecl *TransTemplate
2603fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
2604fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                                              Template));
2605fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!TransTemplate)
2606fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return TemplateName();
2607fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2608fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2609fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        TransTemplate == Template)
2610fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return Name;
2611fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2612fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return TemplateName(TransTemplate);
2613fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  }
2614fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2615fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  if (SubstTemplateTemplateParmPackStorage *SubstPack
2616fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = Name.getAsSubstTemplateTemplateParmPack()) {
2617fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    TemplateTemplateParmDecl *TransParam
2618fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    = cast_or_null<TemplateTemplateParmDecl>(
2619fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor            getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
2620fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!TransParam)
2621fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return TemplateName();
2622fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2623fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2624fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        TransParam == SubstPack->getParameterPack())
2625fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return Name;
2626fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2627fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return getDerived().RebuildTemplateName(TransParam,
2628fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            SubstPack->getArgumentPack());
2629fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  }
2630fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2631fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  // These should be getting filtered out before they reach the AST.
2632fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  llvm_unreachable("overloaded function decl survived to here");
2633fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  return TemplateName();
2634fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor}
2635fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2636fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregortemplate<typename Derived>
2637833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
2638833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
2639833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2640833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
2641670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
2642670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
26439f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
2644833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2645833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2646833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
2647833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
2648a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2649c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2650833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2651833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2652788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
2653b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor  case TemplateArgument::TemplateExpansion: {
2654b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    NestedNameSpecifierLocBuilder Builder;
2655b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    TemplateName Template = Arg.getAsTemplate();
2656b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
2657b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
2658b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
2659b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
2660b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor
2661b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (Arg.getKind() == TemplateArgument::Template)
2662b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      Output = TemplateArgumentLoc(Arg,
2663b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                   Builder.getWithLocInContext(SemaRef.Context),
2664b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                   Loc);
2665b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    else
2666b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      Output = TemplateArgumentLoc(Arg,
2667b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                   Builder.getWithLocInContext(SemaRef.Context),
2668b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                   Loc, Loc);
2669b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor
2670a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    break;
2671b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor  }
2672a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
2673833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
2674833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2675833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2676833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2677833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
2678670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
2679833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
2680828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2681833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2682833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2683833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2684833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2685833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2686833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
2687833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
2688833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2689833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
2690833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
2691833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
2692833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
2693833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
2694833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
26951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2696670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
2697a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2698833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
2699a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2700833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2701833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
2702833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
2703833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2704833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2705833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2706670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
27071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2708670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
2709833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
2710972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
2711972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2712972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
2713788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
27147c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2715833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
2716833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2717828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
2718828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
2719828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
2720f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                                   Sema::Unevaluated);
272160d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult E = getDerived().TransformExpr(SourceExpr);
27229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      SourceExpr = (E.isInvalid() ? 0 : E.take());
2723828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
2724828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2725828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2726833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2727670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
27281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2729788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
2730b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
2731b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (QualifierLoc) {
2732b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
2733b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      if (!QualifierLoc)
2734b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor        return true;
2735b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    }
2736b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor
27371d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor    CXXScopeSpec SS;
27381d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor    SS.Adopt(QualifierLoc);
2739788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
27401d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor      = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
27411d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor                                           Input.getTemplateNameLoc());
2742788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
2743788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
2744c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2745b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
2746788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
2747788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
2748788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
2749a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
2750a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
2751a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    llvm_unreachable("Caller should expand pack expansions");
2752a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
2753670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
2754670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
27551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
2756f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                                 Sema::Unevaluated);
27571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2758833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
2759833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2760833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
276160d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult E
2762833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2763833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
27649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take());
2765833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2766670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
27671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2768670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2769670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2770670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
27711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2772670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2773670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
27741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2775833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2776833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2777833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2778828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2779828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2780828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2781828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2782833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2783833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2784828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2785670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2786910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor
2787910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgument *TransformedArgsPtr
2788910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      = new (getSema().Context) TemplateArgument[TransformedArgs.size()];
2789910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    std::copy(TransformedArgs.begin(), TransformedArgs.end(),
2790910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor              TransformedArgsPtr);
2791910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(TransformedArgsPtr,
2792910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                  TransformedArgs.size()),
2793910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 Input.getLocInfo());
2794833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2795670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2796670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
27971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2798670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2799833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2800670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2801670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
28027ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor/// \brief Iterator adaptor that invents template argument location information
28037ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor/// for each of the template arguments in its underlying iterator.
28047ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregortemplate<typename Derived, typename InputIterator>
28057ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorclass TemplateArgumentLocInventIterator {
28067ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  TreeTransform<Derived> &Self;
28077ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  InputIterator Iter;
28087ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28097ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorpublic:
28107ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef TemplateArgumentLoc value_type;
28117ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef TemplateArgumentLoc reference;
28127ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef typename std::iterator_traits<InputIterator>::difference_type
28137ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    difference_type;
28147ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef std::input_iterator_tag iterator_category;
28157ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28167ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  class pointer {
28177ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLoc Arg;
2818fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor
28197ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  public:
28207ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
28217ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28227ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    const TemplateArgumentLoc *operator->() const { return &Arg; }
28237ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  };
28247ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28257ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  TemplateArgumentLocInventIterator() { }
28267ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28277ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
28287ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                             InputIterator Iter)
28297ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    : Self(Self), Iter(Iter) { }
28307ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28317ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  TemplateArgumentLocInventIterator &operator++() {
28327ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    ++Iter;
28337ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return *this;
2834fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  }
2835fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor
28367ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  TemplateArgumentLocInventIterator operator++(int) {
28377ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocInventIterator Old(*this);
28387ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    ++(*this);
28397ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return Old;
28407ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
28417ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28427ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  reference operator*() const {
28437ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLoc Result;
28447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    Self.InventTemplateArgumentLoc(*Iter, Result);
28457ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return Result;
28467ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
28477ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28487ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  pointer operator->() const { return pointer(**this); }
28497ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28507ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  friend bool operator==(const TemplateArgumentLocInventIterator &X,
28517ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                         const TemplateArgumentLocInventIterator &Y) {
28527ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return X.Iter == Y.Iter;
28537ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
2854fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor
28557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  friend bool operator!=(const TemplateArgumentLocInventIterator &X,
28567ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                         const TemplateArgumentLocInventIterator &Y) {
28577ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return X.Iter != Y.Iter;
28587ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
28597ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor};
28607ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
28617f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregortemplate<typename Derived>
28627ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregortemplate<typename InputIterator>
28637ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorbool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
28647ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                                        InputIterator Last,
28657f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor                                            TemplateArgumentListInfo &Outputs) {
28667ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  for (; First != Last; ++First) {
28677f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor    TemplateArgumentLoc Out;
28687ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLoc In = *First;
28698491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
28708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    if (In.getArgument().getKind() == TemplateArgument::Pack) {
28718491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // Unpack argument packs, which we translate them into separate
28728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // arguments.
28737ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      // FIXME: We could do much better if we could guarantee that the
28747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      // TemplateArgumentLocInfo for the pack expansion would be usable for
28757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      // all of the template arguments in the argument pack.
28767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      typedef TemplateArgumentLocInventIterator<Derived,
28777ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                                TemplateArgument::pack_iterator>
28787ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor        PackLocIterator;
28797ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      if (TransformTemplateArguments(PackLocIterator(*this,
28807ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                                 In.getArgument().pack_begin()),
28817ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                     PackLocIterator(*this,
28827ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                                   In.getArgument().pack_end()),
28837ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                     Outputs))
28847ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor        return true;
28858491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
28868491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      continue;
28878491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    }
28888491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
28898491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    if (In.getArgument().isPackExpansion()) {
28908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // We have a pack expansion, for which we will be substituting into
28918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // the pattern.
28928491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      SourceLocation Ellipsis;
2893cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      llvm::Optional<unsigned> OrigNumExpansions;
28948491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      TemplateArgumentLoc Pattern
2895cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        = In.getPackExpansionPattern(Ellipsis, OrigNumExpansions,
2896cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                     getSema().Context);
28978491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
28988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
28998491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
29008491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
29018491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
29028491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // Determine whether the set of unexpanded parameter packs can and should
29038491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // be expanded.
29048491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      bool Expand = true;
2905d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      bool RetainExpansion = false;
2906cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
29078491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      if (getDerived().TryExpandParameterPacks(Ellipsis,
29088491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                               Pattern.getSourceRange(),
29098491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                               Unexpanded.data(),
29108491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                               Unexpanded.size(),
2911d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               Expand,
2912d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               RetainExpansion,
2913d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               NumExpansions))
29148491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        return true;
29158491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
29168491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      if (!Expand) {
29178491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        // The transform has determined that we should perform a simple
29188491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        // transformation on the pack expansion, producing another pack
29198491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        // expansion.
29208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        TemplateArgumentLoc OutPattern;
29218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
29228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        if (getDerived().TransformTemplateArgument(Pattern, OutPattern))
29238491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor          return true;
29248491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
2925cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
2926cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                NumExpansions);
29278491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        if (Out.getArgument().isNull())
29288491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor          return true;
29298491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
29308491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        Outputs.addArgument(Out);
29318491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        continue;
29328491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      }
29338491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
29348491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // The transform has determined that we should perform an elementwise
29358491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // expansion of the pattern. Do so.
2936cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      for (unsigned I = 0; I != *NumExpansions; ++I) {
29378491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
29388491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
29398491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        if (getDerived().TransformTemplateArgument(Pattern, Out))
29408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor          return true;
29418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
294277d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor        if (Out.getArgument().containsUnexpandedParameterPack()) {
2943cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor          Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
2944cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                  OrigNumExpansions);
294577d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor          if (Out.getArgument().isNull())
294677d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor            return true;
294777d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor        }
294877d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor
29498491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        Outputs.addArgument(Out);
29508491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      }
29518491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
29523cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      // If we're supposed to retain a pack expansion, do so by temporarily
29533cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      // forgetting the partially-substituted parameter pack.
29543cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      if (RetainExpansion) {
29553cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        ForgetPartiallySubstitutedPackRAII Forget(getDerived());
29563cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor
29573cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        if (getDerived().TransformTemplateArgument(Pattern, Out))
29583cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor          return true;
29593cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor
2960cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
2961cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                OrigNumExpansions);
29623cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        if (Out.getArgument().isNull())
29633cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor          return true;
29643cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor
29653cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        Outputs.addArgument(Out);
29663cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      }
2967d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
29688491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      continue;
29698491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    }
29708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
29718491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    // The simple case:
29728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    if (getDerived().TransformTemplateArgument(In, Out))
29737f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor      return true;
29747f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
29757f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor    Outputs.addArgument(Out);
29767f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  }
29777f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
29787f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  return false;
29797f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
29807f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor}
29817f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
2982577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
298743fed0de4f5bc189e45562491f83d5193eb8dac0John McCallQualType TreeTransform<Derived>::TransformType(QualType T) {
2988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
29901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2993c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
2994c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                getDerived().getBaseLocation());
2995c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
299643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(DI);
29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2998a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2999a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
30001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3001a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
3002577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
300543fed0de4f5bc189e45562491f83d5193eb8dac0John McCallTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
3006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
3007a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
30081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
30101bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
3011a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
3012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
30131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType Result = getDerived().TransformType(TLB, TL);
3015a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3016a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
30171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3018a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3019577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3022a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
302343fed0de4f5bc189e45562491f83d5193eb8dac0John McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
3024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
3025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
3026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
3027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
302843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
3029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
30329f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
3033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
3034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3036a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
3037a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
3038a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
3040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
30411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
30421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
3043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
304443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                               QualifiedTypeLoc T) {
3045a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
3046a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
304743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
3048a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3051a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
3052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
3053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
3054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
3055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
30561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30572865474261a608c7873b87ba4af110d17907896dJohn McCall  if (!Quals.empty()) {
30582865474261a608c7873b87ba4af110d17907896dJohn McCall    Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
30592865474261a608c7873b87ba4af110d17907896dJohn McCall    TLB.push<QualifiedTypeLoc>(Result);
30602865474261a608c7873b87ba4af110d17907896dJohn McCall    // No location information to preserve.
30612865474261a608c7873b87ba4af110d17907896dJohn McCall  }
3062a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3063a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
3065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
306643fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate<typename Derived>
3067b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTypeLoc
3068b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
306943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   QualType ObjectType,
307043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   NamedDecl *UnqualLookup,
3071b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                   CXXScopeSpec &SS) {
3072b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  QualType T = TL.getType();
307343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  if (getDerived().AlreadyTransformed(T))
3074b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    return TL;
3075b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
307643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TypeLocBuilder TLB;
307743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType Result;
3078b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
307943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  if (isa<TemplateSpecializationType>(T)) {
3080b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    TemplateSpecializationTypeLoc SpecTL
3081b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      = cast<TemplateSpecializationTypeLoc>(TL);
3082b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
308343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    TemplateName Template =
3084b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      getDerived().TransformTemplateName(SS,
3085b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         SpecTL.getTypePtr()->getTemplateName(),
3086b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         SpecTL.getTemplateNameLoc(),
308743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                         ObjectType, UnqualLookup);
3088b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    if (Template.isNull())
3089b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      return TypeLoc();
3090b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
3091b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3092b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                              Template);
309343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  } else if (isa<DependentTemplateSpecializationType>(T)) {
3094b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    DependentTemplateSpecializationTypeLoc SpecTL
3095b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      = cast<DependentTemplateSpecializationTypeLoc>(TL);
3096a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
3097b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    TemplateName Template
3098b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      = getDerived().RebuildTemplateName(SS,
3099b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         *SpecTL.getTypePtr()->getIdentifier(),
3100b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         SpecTL.getNameLoc(),
3101b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         ObjectType, UnqualLookup);
3102a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    if (Template.isNull())
3103b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      return TypeLoc();
3104b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
3105b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3106b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                                       SpecTL,
3107087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor                                                                     Template,
3108087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor                                                                       SS);
310943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  } else {
311043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    // Nothing special needs to be done for these.
3111b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    Result = getDerived().TransformType(TLB, TL);
311243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  }
3113b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
3114b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  if (Result.isNull())
3115b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    return TypeLoc();
3116b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
3117b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc();
311843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall}
311943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
3120c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename Derived>
3121b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTypeSourceInfo *
3122b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3123c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                   QualType ObjectType,
3124c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                   NamedDecl *UnqualLookup,
3125c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                   CXXScopeSpec &SS) {
3126c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // FIXME: Painfully copy-paste from the above!
3127c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3128b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  QualType T = TSInfo->getType();
3129c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (getDerived().AlreadyTransformed(T))
3130b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    return TSInfo;
3131c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3132c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  TypeLocBuilder TLB;
3133c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  QualType Result;
3134c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3135b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  TypeLoc TL = TSInfo->getTypeLoc();
3136c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (isa<TemplateSpecializationType>(T)) {
3137c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    TemplateSpecializationTypeLoc SpecTL
3138c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      = cast<TemplateSpecializationTypeLoc>(TL);
3139c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3140b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    TemplateName Template
3141b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    = getDerived().TransformTemplateName(SS,
3142fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                         SpecTL.getTypePtr()->getTemplateName(),
3143fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                         SpecTL.getTemplateNameLoc(),
3144c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                         ObjectType, UnqualLookup);
3145c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    if (Template.isNull())
3146b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      return 0;
3147c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3148c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3149c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                              Template);
3150c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  } else if (isa<DependentTemplateSpecializationType>(T)) {
3151c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    DependentTemplateSpecializationTypeLoc SpecTL
3152c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      = cast<DependentTemplateSpecializationTypeLoc>(TL);
3153c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3154a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    TemplateName Template
3155fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = getDerived().RebuildTemplateName(SS,
31567c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                         *SpecTL.getTypePtr()->getIdentifier(),
3157fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                         SpecTL.getNameLoc(),
31587c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                         ObjectType, UnqualLookup);
3159a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    if (Template.isNull())
3160b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      return 0;
3161a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
3162c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3163a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                                       SpecTL,
3164087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor                                                                       Template,
3165087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor                                                                       SS);
3166c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  } else {
3167c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    // Nothing special needs to be done for these.
3168c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    Result = getDerived().TransformType(TLB, TL);
3169c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  }
3170c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3171c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (Result.isNull())
3172b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    return 0;
3173c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3174b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3175c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor}
3176c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3177a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
3178a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
3179a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
3180a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
3181a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
3182a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
3183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3184a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
3185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
318643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      BuiltinTypeLoc T) {
3187ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
3188ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
3189ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
3190ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
3191ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
3192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
319643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      ComplexTypeLoc T) {
3197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
3198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
3199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
3202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
320343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      PointerTypeLoc TL) {
3204c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType PointeeType
3205c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
320692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType.isNull())
320792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return QualType();
320892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
320992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  QualType Result = TL.getType();
3210c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (PointeeType->getAs<ObjCObjectType>()) {
321192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // A dependent pointer type 'T *' has is being transformed such
321292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // that an Objective-C class type is being replaced for 'T'. The
321392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // resulting pointer type is an ObjCObjectPointerType, not a
321492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // PointerType.
3215c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
3216c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3217c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
3218c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    NewT.setStarLoc(TL.getStarLoc());
321992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Result;
322092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
322143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
322292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (getDerived().AlwaysRebuild() ||
322392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      PointeeType != TL.getPointeeLoc().getType()) {
322492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
322592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Result.isNull())
322692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return QualType();
322792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
3228c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
322992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
323092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
3231c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Result;
3232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
32351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
3236a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
323743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                  BlockPointerTypeLoc TL) {
3238db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  QualType PointeeType
3239c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
3240c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (PointeeType.isNull())
3241c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return QualType();
3242c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3243c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType Result = TL.getType();
3244c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (getDerived().AlwaysRebuild() ||
3245c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      PointeeType != TL.getPointeeLoc().getType()) {
3246c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildBlockPointerType(PointeeType,
3247db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor                                                  TL.getSigilLoc());
3248db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor    if (Result.isNull())
3249db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor      return QualType();
3250db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  }
3251db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor
325239968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
3253db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
3254db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  return Result;
3255a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
32561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
325785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
325885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
325985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
326085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
326185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
326285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
326385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
326443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                               ReferenceTypeLoc TL) {
326585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
326685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
326785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
326885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
326985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
327085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
327185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
327285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
327385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
327485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
327585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
327685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
327785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
327885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
327985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
328085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
328185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
328285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
328385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
328485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
328585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
328685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
328785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
328885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
328985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
329085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
329185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
329285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
3293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
3294a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
329643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                 LValueReferenceTypeLoc TL) {
329743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return TransformReferenceType(TLB, TL);
3298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
32991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
3301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3302a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
330343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                 RValueReferenceTypeLoc TL) {
330443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return TransformReferenceType(TLB, TL);
3305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
33081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
3309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
331043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   MemberPointerTypeLoc TL) {
3311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
3312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
3313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3315b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
3316b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  TypeSourceInfo* NewClsTInfo = 0;
3317b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  if (OldClsTInfo) {
3318b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara    NewClsTInfo = getDerived().TransformType(OldClsTInfo);
3319b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara    if (!NewClsTInfo)
3320b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara      return QualType();
3321b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  }
3322b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara
3323b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  const MemberPointerType *T = TL.getTypePtr();
3324b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  QualType OldClsType = QualType(T->getClass(), 0);
3325b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  QualType NewClsType;
3326b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  if (NewClsTInfo)
3327b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara    NewClsType = NewClsTInfo->getType();
3328b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  else {
3329b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara    NewClsType = getDerived().TransformType(OldClsType);
3330b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara    if (NewClsType.isNull())
3331b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara      return QualType();
3332b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  }
33331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
3337b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara      NewClsType != OldClsType) {
3338b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara    Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
333985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
3340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3342a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3344a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
3345a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
3346b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  NewTL.setClassTInfo(NewClsTInfo);
3347a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
33511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
3353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
335443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   ConstantArrayTypeLoc TL) {
3355f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const ConstantArrayType *T = TL.getTypePtr();
3356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3361a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
3363a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
3364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
3365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
336685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
336785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
3368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3371c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3372a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
3373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
3374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
33751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3376a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
3377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
3378f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
3380a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
3382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
3388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
338943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                              IncompleteArrayTypeLoc TL) {
3390f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const IncompleteArrayType *T = TL.getTypePtr();
3391a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3396a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
3398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
3399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
340085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
340185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
3402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3405c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
3407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
3408a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
3409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
3410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
341743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   VariableArrayTypeLoc TL) {
3418f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const VariableArrayType *T = TL.getTypePtr();
3419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
34221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3423670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
3424f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3425670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
342660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SizeResult
3427a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
3428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
3429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
34301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Size = SizeResult.take();
3432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
3436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
3437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
3438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
34399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Size,
3440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
344185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
3442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3445c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
3447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
3448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
3449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
34501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
345743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                             DependentSizedArrayTypeLoc TL) {
3458f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DependentSizedArrayType *T = TL.getTypePtr();
3459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
34621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3463670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
3464f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
34651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34663b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Prefer the expression from the TypeLoc;  the other may have been uniqued.
34673b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Expr *origSize = TL.getSizeExpr();
34683b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!origSize) origSize = T->getSizeExpr();
34693b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
34703b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExprResult sizeResult
34713b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    = getDerived().TransformExpr(origSize);
34723b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (sizeResult.isInvalid())
3473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
34741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34753b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Expr *size = sizeResult.get();
3476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3477a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3478a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3479a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
34803b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      size != origSize) {
3481a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
3482a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
34833b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                         size,
3484a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
348585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
3486a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3487a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
34891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3490a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
3491a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
3492a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
3493a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
3494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
34953b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  NewTL.setSizeExpr(size);
3496a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3497a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
3502a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
350343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                      DependentSizedExtVectorTypeLoc TL) {
3504f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DependentSizedExtVectorType *T = TL.getTypePtr();
3505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3506a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
3507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
3508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
35101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3511670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
3512f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3513670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
351460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
3515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
3516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
35171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3518a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3519a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3520eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
3521eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
3522a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
35239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                             Size.take(),
3524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
3525a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3526a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3527a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3528a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3529a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
3530a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
3531a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
3532a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
3533a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
3534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
3535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
3536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
3537a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3538a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3539a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
354443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                     VectorTypeLoc TL) {
3545f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const VectorType *T = TL.getTypePtr();
3546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
3547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3550a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3551a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
355382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
3554e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                            T->getVectorKind());
3555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3558c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
3560a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
35611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3566a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
356743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                        ExtVectorTypeLoc TL) {
3568f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const VectorType *T = TL.getTypePtr();
3569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
3570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
3576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
3577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
3578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
3579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3582c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3583a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
3584a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
35891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
359021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
35916a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas GregorTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm,
35926a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                       llvm::Optional<unsigned> NumExpansions) {
359321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
35946a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  TypeSourceInfo *NewDI = 0;
35956a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
35966a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
35976a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    // If we're substituting into a pack expansion type and we know the
35986a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    TypeLoc OldTL = OldDI->getTypeLoc();
35996a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    PackExpansionTypeLoc OldExpansionTL = cast<PackExpansionTypeLoc>(OldTL);
36006a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
36016a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    TypeLocBuilder TLB;
36026a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    TypeLoc NewTL = OldDI->getTypeLoc();
36036a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    TLB.reserve(NewTL.getFullDataSize());
36046a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
36056a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    QualType Result = getDerived().TransformType(TLB,
36066a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                               OldExpansionTL.getPatternLoc());
36076a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    if (Result.isNull())
36086a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      return 0;
36096a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
36106a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    Result = RebuildPackExpansionType(Result,
36116a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                OldExpansionTL.getPatternLoc().getSourceRange(),
36126a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                      OldExpansionTL.getEllipsisLoc(),
36136a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                      NumExpansions);
36146a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    if (Result.isNull())
36156a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      return 0;
36166a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
36176a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    PackExpansionTypeLoc NewExpansionTL
36186a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      = TLB.push<PackExpansionTypeLoc>(Result);
36196a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
36206a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
36216a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  } else
36226a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    NewDI = getDerived().TransformType(OldDI);
362321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
362421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
362521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
362621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
362721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
362821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
362921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
363021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
363121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
363221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
363321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
363421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
363521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
363616573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                               OldParm->getStorageClassAsWritten(),
363721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
363821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
363921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
364021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
364121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
3642a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor  TransformFunctionTypeParams(SourceLocation Loc,
3643a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                              ParmVarDecl **Params, unsigned NumParams,
3644a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                              const QualType *ParamTypes,
3645a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                              llvm::SmallVectorImpl<QualType> &OutParamTypes,
3646a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                              llvm::SmallVectorImpl<ParmVarDecl*> *PVars) {
3647a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor  for (unsigned i = 0; i != NumParams; ++i) {
3648a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    if (ParmVarDecl *OldParm = Params[i]) {
36496a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      llvm::Optional<unsigned> NumExpansions;
3650406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      ParmVarDecl *NewParm = 0;
3651603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      if (OldParm->isParameterPack()) {
3652603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // We have a function parameter pack that may need to be expanded.
3653603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3654603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3655603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // Find the parameter packs that could be expanded.
3656c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
3657c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(TL);
3658c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        TypeLoc Pattern = ExpansionTL.getPatternLoc();
3659c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
3660406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor        assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
3661406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor
3662603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // Determine whether we should expand the parameter packs.
3663603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        bool ShouldExpand = false;
3664d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor        bool RetainExpansion = false;
36656a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor        llvm::Optional<unsigned> OrigNumExpansions
36666a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor          = ExpansionTL.getTypePtr()->getNumExpansions();
36676a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor        NumExpansions = OrigNumExpansions;
3668c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
3669c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor                                                 Pattern.getSourceRange(),
3670603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                                 Unexpanded.data(),
3671603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                                 Unexpanded.size(),
3672d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                                 ShouldExpand,
3673d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                                 RetainExpansion,
3674d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                                 NumExpansions)) {
3675603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          return true;
3676603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        }
3677603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3678603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        if (ShouldExpand) {
3679603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          // Expand the function parameter pack into multiple, separate
3680603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          // parameters.
368112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor          getDerived().ExpandingFunctionParameterPack(OldParm);
3682cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor          for (unsigned I = 0; I != *NumExpansions; ++I) {
3683603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor            Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3684603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor            ParmVarDecl *NewParm
36856a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor              = getDerived().TransformFunctionTypeParam(OldParm,
36866a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                                        OrigNumExpansions);
3687603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor            if (!NewParm)
3688603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor              return true;
3689603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3690a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor            OutParamTypes.push_back(NewParm->getType());
3691a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor            if (PVars)
3692a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor              PVars->push_back(NewParm);
3693603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          }
3694d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
3695d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor          // If we're supposed to retain a pack expansion, do so by temporarily
3696d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor          // forgetting the partially-substituted parameter pack.
3697d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor          if (RetainExpansion) {
3698d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3699d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            ParmVarDecl *NewParm
37006a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor              = getDerived().TransformFunctionTypeParam(OldParm,
37016a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                                        OrigNumExpansions);
3702d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            if (!NewParm)
3703d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor              return true;
3704d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
3705d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            OutParamTypes.push_back(NewParm->getType());
3706d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            if (PVars)
3707d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor              PVars->push_back(NewParm);
3708d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor          }
3709d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
3710603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          // We're done with the pack expansion.
3711603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          continue;
3712603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        }
3713603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3714603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // We'll substitute the parameter now without expanding the pack
3715603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // expansion.
3716406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3717406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor        NewParm = getDerived().TransformFunctionTypeParam(OldParm,
3718406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor                                                          NumExpansions);
3719406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      } else {
3720406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor        NewParm = getDerived().TransformFunctionTypeParam(OldParm,
3721406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor                                                  llvm::Optional<unsigned>());
3722603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      }
3723406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor
372421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
372521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
3726603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3727a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor      OutParamTypes.push_back(NewParm->getType());
3728a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor      if (PVars)
3729a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor        PVars->push_back(NewParm);
3730603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      continue;
3731603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    }
3732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
3734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
3735a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    QualType OldType = ParamTypes[i];
3736603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    bool IsPackExpansion = false;
3737cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    llvm::Optional<unsigned> NumExpansions;
3738406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    QualType NewType;
3739603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    if (const PackExpansionType *Expansion
3740603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                       = dyn_cast<PackExpansionType>(OldType)) {
3741603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      // We have a function parameter pack that may need to be expanded.
3742603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      QualType Pattern = Expansion->getPattern();
3743603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3744603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3745603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3746603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      // Determine whether we should expand the parameter packs.
3747603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      bool ShouldExpand = false;
3748d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      bool RetainExpansion = false;
3749a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor      if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
3750603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                               Unexpanded.data(),
3751603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                               Unexpanded.size(),
3752d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               ShouldExpand,
3753d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               RetainExpansion,
3754d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               NumExpansions)) {
375521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
3756603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      }
3757603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3758603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      if (ShouldExpand) {
3759603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // Expand the function parameter pack into multiple, separate
3760603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // parameters.
3761cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        for (unsigned I = 0; I != *NumExpansions; ++I) {
3762603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3763603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          QualType NewType = getDerived().TransformType(Pattern);
3764603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          if (NewType.isNull())
3765603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor            return true;
3766603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3767a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor          OutParamTypes.push_back(NewType);
3768a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor          if (PVars)
3769a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor            PVars->push_back(0);
3770603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        }
3771603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3772603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // We're done with the pack expansion.
3773603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        continue;
3774603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      }
3775603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
37763cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      // If we're supposed to retain a pack expansion, do so by temporarily
37773cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      // forgetting the partially-substituted parameter pack.
37783cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      if (RetainExpansion) {
37793cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        ForgetPartiallySubstitutedPackRAII Forget(getDerived());
37803cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        QualType NewType = getDerived().TransformType(Pattern);
37813cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        if (NewType.isNull())
37823cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor          return true;
37833cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor
37843cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        OutParamTypes.push_back(NewType);
37853cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        if (PVars)
37863cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor          PVars->push_back(0);
37873cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      }
3788d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
3789603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      // We'll substitute the parameter now without expanding the pack
3790603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      // expansion.
3791603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      OldType = Expansion->getPattern();
3792603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      IsPackExpansion = true;
3793406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3794406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      NewType = getDerived().TransformType(OldType);
3795406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    } else {
3796406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      NewType = getDerived().TransformType(OldType);
3797a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
3798603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3799603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    if (NewType.isNull())
3800603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      return true;
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3802603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    if (IsPackExpansion)
3803cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      NewType = getSema().Context.getPackExpansionType(NewType,
3804cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                       NumExpansions);
3805603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3806a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    OutParamTypes.push_back(NewType);
3807a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    if (PVars)
3808a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor      PVars->push_back(0);
3809577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
38101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
381121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
3812603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor  }
381321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
381421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
381521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
381621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
381743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   FunctionProtoTypeLoc TL) {
38187e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // Transform the parameters and return type.
38197e010a04fef171049291d8cb3047f118566da090Douglas Gregor  //
38207e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // We instantiate in source order, with the return type first followed by
38217e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // the parameters, because users tend to expect this (even if they shouldn't
38227e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // rely on it!).
38237e010a04fef171049291d8cb3047f118566da090Douglas Gregor  //
3824dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  // When the function has a trailing return type, we instantiate the
3825dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  // parameters before the return type,  since the return type can then refer
3826dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  // to the parameters themselves (via decltype, sizeof, etc.).
3827dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  //
382821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
382921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
3830f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const FunctionProtoType *T = TL.getTypePtr();
38317e010a04fef171049291d8cb3047f118566da090Douglas Gregor
3832dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  QualType ResultType;
3833dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
3834dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  if (TL.getTrailingReturn()) {
3835a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(),
3836a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 TL.getParmArray(),
3837a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 TL.getNumArgs(),
3838a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                             TL.getTypePtr()->arg_type_begin(),
3839a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 ParamTypes, &ParamDecls))
3840dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      return QualType();
3841dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
3842dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
3843dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    if (ResultType.isNull())
3844dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      return QualType();
3845dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  }
3846dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  else {
3847dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
3848dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    if (ResultType.isNull())
3849dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      return QualType();
3850dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
3851a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(),
3852a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 TL.getParmArray(),
3853a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 TL.getNumArgs(),
3854a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                             TL.getTypePtr()->arg_type_begin(),
3855a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 ParamTypes, &ParamDecls))
3856dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      return QualType();
3857dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  }
3858dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
3859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3860a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3861a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
3862bd5f9f708aa31920d3bd73aa10fcb5de424c657aDouglas Gregor      T->getNumArgs() != ParamTypes.size() ||
3863a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
3864a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
3865a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
3866a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
3867a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
3868fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getTypeQuals(),
3869c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                                   T->getRefQualifier(),
3870fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getExtInfo());
3871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
38741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
3876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3878dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  NewTL.setTrailingReturn(TL.getTrailingReturn());
3879a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
3880a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
3881a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3882a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
38841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
3887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
388843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                 FunctionNoProtoTypeLoc TL) {
3889f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const FunctionNoProtoType *T = TL.getTypePtr();
3890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
3891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
3892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
3893a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3895a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3896a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
3897a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
3898a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3899a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
3900a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3901a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3902dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  NewTL.setTrailingReturn(false);
3903a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3904a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
39061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3907ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
3908ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
390943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                 UnresolvedUsingTypeLoc TL) {
3910f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const UnresolvedUsingType *T = TL.getTypePtr();
39117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
3912ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
3913ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
3914ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3915ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
3916ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
3917ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
3918ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
3919ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
3920ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
3921ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3922ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
3923ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
3924ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
3925ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
3926ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3927ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
3928ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
3929ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
3930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
393243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      TypedefTypeLoc TL) {
3933f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const TypedefType *T = TL.getTypePtr();
3934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
39357c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
39367c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
3937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
3938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
39391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3942a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
3943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
3944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
3949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
39501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3952577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
39531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3955a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
395643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      TypeOfExprTypeLoc TL) {
3957670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
3958f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
39591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
396060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3964a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3965a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3966cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
39672a984cad5ac3fdceeff2bd99daa7b90979313475John McCall    Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
3968a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3969a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3971a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
39721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3973a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3974cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3975cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3976cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3977a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3978a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
398343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                     TypeOfTypeLoc TL) {
3984cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3985cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3986cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
3987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
39881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3990cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3991cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3993a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3994a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
39951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3996a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3997cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3998cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3999cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
4000cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
4001a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4002a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
40041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
400743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                       DecltypeTypeLoc TL) {
4008f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DecltypeType *T = TL.getTypePtr();
4009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4010670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
4011f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
40121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
401360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
4014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
4015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
40161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4017a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4018a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4019a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
40202a984cad5ac3fdceeff2bd99daa7b90979313475John McCall    Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
4021a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4022a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4024a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
4025a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
4027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
40281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4029a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
403334b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
403434b41d939a1328f484511c6002ba2456db879a29Richard Smith                                                   AutoTypeLoc TL) {
403534b41d939a1328f484511c6002ba2456db879a29Richard Smith  const AutoType *T = TL.getTypePtr();
403634b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType OldDeduced = T->getDeducedType();
403734b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType NewDeduced;
403834b41d939a1328f484511c6002ba2456db879a29Richard Smith  if (!OldDeduced.isNull()) {
403934b41d939a1328f484511c6002ba2456db879a29Richard Smith    NewDeduced = getDerived().TransformType(OldDeduced);
404034b41d939a1328f484511c6002ba2456db879a29Richard Smith    if (NewDeduced.isNull())
404134b41d939a1328f484511c6002ba2456db879a29Richard Smith      return QualType();
404234b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
404334b41d939a1328f484511c6002ba2456db879a29Richard Smith
404434b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType Result = TL.getType();
404534b41d939a1328f484511c6002ba2456db879a29Richard Smith  if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced) {
404634b41d939a1328f484511c6002ba2456db879a29Richard Smith    Result = getDerived().RebuildAutoType(NewDeduced);
404734b41d939a1328f484511c6002ba2456db879a29Richard Smith    if (Result.isNull())
404834b41d939a1328f484511c6002ba2456db879a29Richard Smith      return QualType();
404934b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
405034b41d939a1328f484511c6002ba2456db879a29Richard Smith
405134b41d939a1328f484511c6002ba2456db879a29Richard Smith  AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
405234b41d939a1328f484511c6002ba2456db879a29Richard Smith  NewTL.setNameLoc(TL.getNameLoc());
405334b41d939a1328f484511c6002ba2456db879a29Richard Smith
405434b41d939a1328f484511c6002ba2456db879a29Richard Smith  return Result;
405534b41d939a1328f484511c6002ba2456db879a29Richard Smith}
405634b41d939a1328f484511c6002ba2456db879a29Richard Smith
405734b41d939a1328f484511c6002ba2456db879a29Richard Smithtemplate<typename Derived>
4058a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
405943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                     RecordTypeLoc TL) {
4060f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const RecordType *T = TL.getTypePtr();
4061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
40627c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
40637c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
4064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
4065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
40661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4067a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4068a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
4070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
4071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
40741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4075a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
4076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
4077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
40801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
408343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   EnumTypeLoc TL) {
4084f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const EnumType *T = TL.getTypePtr();
4085577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
40867c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
40877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
4088577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
4089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
40901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4092a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
4094a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
4095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
4098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
4100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
41011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4102a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
41047da2431c23ef1ee8acb114e39692246e1801afc2John McCall
41053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
41063cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
41073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
410843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                         InjectedClassNameTypeLoc TL) {
41093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
41103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
41113cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
41123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
41133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
41143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
41153cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
41163cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
41173cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
4118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
4120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
412143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                TemplateTypeParmTypeLoc TL) {
4122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
4123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
41251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
412649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
4127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
412843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                         SubstTemplateTypeParmTypeLoc TL) {
41290b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  const SubstTemplateTypeParmType *T = TL.getTypePtr();
41300b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor
41310b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  // Substitute into the replacement type, which itself might involve something
41320b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  // that needs to be transformed. This only tends to occur with default
41330b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  // template arguments of template template parameters.
41340b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
41350b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  QualType Replacement = getDerived().TransformType(T->getReplacementType());
41360b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  if (Replacement.isNull())
41370b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor    return QualType();
41380b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor
41390b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  // Always canonicalize the replacement type.
41400b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  Replacement = SemaRef.Context.getCanonicalType(Replacement);
41410b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  QualType Result
41420b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor    = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
41430b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor                                                   Replacement);
41440b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor
41450b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  // Propagate type-source information.
41460b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  SubstTemplateTypeParmTypeLoc NewTL
41470b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor    = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
41480b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  NewTL.setNameLoc(TL.getNameLoc());
41490b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor  return Result;
41500b4bcb639a9aab9c466a9e6d6e61b3bd1bb36d68Douglas Gregor
415149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
415249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
415349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
4154c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
4155c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                          TypeLocBuilder &TLB,
4156c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                          SubstTemplateTypeParmPackTypeLoc TL) {
4157c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  return TransformTypeSpecType(TLB, TL);
4158c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
4159c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
4160c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregortemplate<typename Derived>
4161833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
416243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                        TypeLocBuilder &TLB,
416343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                           TemplateSpecializationTypeLoc TL) {
416443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
4165828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
41661d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor  // The nested-name-specifier never matters in a TemplateSpecializationType,
41671d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor  // because we can't have a dependent nested-name-specifier anyway.
41681d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor  CXXScopeSpec SS;
416943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TemplateName Template
41701d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor    = getDerived().TransformTemplateName(SS, T->getTemplateName(),
41711d752d7d68359fd8f7701585d4658aa70e129261Douglas Gregor                                         TL.getTemplateNameLoc());
417243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  if (Template.isNull())
417343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    return QualType();
4174833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
417543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
4176dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
417743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
41787ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregornamespace {
41797ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// \brief Simple iterator that traverses the template arguments in a
41807ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// container that provides a \c getArgLoc() member function.
41817ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  ///
41827ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// This iterator is intended to be used with the iterator form of
41837ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// \c TreeTransform<Derived>::TransformTemplateArguments().
41847ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  template<typename ArgLocContainer>
41857ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  class TemplateArgumentLocContainerIterator {
41867ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    ArgLocContainer *Container;
41877ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    unsigned Index;
41887ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
41897ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  public:
41907ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    typedef TemplateArgumentLoc value_type;
41917ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    typedef TemplateArgumentLoc reference;
41927ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    typedef int difference_type;
41937ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    typedef std::input_iterator_tag iterator_category;
41947ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
41957ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    class pointer {
41967ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      TemplateArgumentLoc Arg;
41977ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
41987ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    public:
41997ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
42007ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42017ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      const TemplateArgumentLoc *operator->() const {
42027ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor        return &Arg;
42037ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      }
42047ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    };
42057ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42067ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42077ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocContainerIterator() {}
42087ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42097ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
42107ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                 unsigned Index)
42117ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      : Container(&Container), Index(Index) { }
42127ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42137ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocContainerIterator &operator++() {
42147ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      ++Index;
42157ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return *this;
42167ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
42177ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42187ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocContainerIterator operator++(int) {
42197ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      TemplateArgumentLocContainerIterator Old(*this);
42207ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      ++(*this);
42217ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return Old;
42227ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
42237ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42247ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLoc operator*() const {
42257ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return Container->getArgLoc(Index);
42267ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
42277ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42287ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    pointer operator->() const {
42297ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return pointer(Container->getArgLoc(Index));
42307ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
42317ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42327ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    friend bool operator==(const TemplateArgumentLocContainerIterator &X,
4233f7dd69969aa25093ca9a7897a0d8819c145d1c77Douglas Gregor                           const TemplateArgumentLocContainerIterator &Y) {
42347ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return X.Container == Y.Container && X.Index == Y.Index;
42357ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
42367ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42377ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
4238f7dd69969aa25093ca9a7897a0d8819c145d1c77Douglas Gregor                           const TemplateArgumentLocContainerIterator &Y) {
42397ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return !(X == Y);
42407ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
42417ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  };
42427ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor}
42437ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
42447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
424543fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate <typename Derived>
4246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
4247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
4248833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
424943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      TemplateName Template) {
4250d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
4251d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
4252d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
42537ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
42547ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    ArgIterator;
42557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
42567ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                              ArgIterator(TL, TL.getNumArgs()),
42577ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                              NewTemplateArgs))
42587f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor    return QualType();
42591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4260833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
4261833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
4262833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
4263833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
4264833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
4265d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
42661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4267833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
4268833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
4269833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
4270833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
4271833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
4272833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
4273833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4274833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4275833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4277833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
4278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4280a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregortemplate <typename Derived>
4281a88f09f34e86125ee4e6949a757aaed314012664Douglas GregorQualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
4282a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                     TypeLocBuilder &TLB,
4283a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                     DependentTemplateSpecializationTypeLoc TL,
4284087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor                                     TemplateName Template,
4285087eb5a2d3c7988eb7c440cd86cc7479e57d5dc0Douglas Gregor                                     CXXScopeSpec &SS) {
4286a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  TemplateArgumentListInfo NewTemplateArgs;
4287a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
4288a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
4289a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  typedef TemplateArgumentLocContainerIterator<
4290a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor            DependentTemplateSpecializationTypeLoc> ArgIterator;
4291a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
4292a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                              ArgIterator(TL, TL.getNumArgs()),
4293a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                              NewTemplateArgs))
4294a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    return QualType();
4295a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4296a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  // FIXME: maybe don't rebuild if all the template arguments are the same.
4297a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4298a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
4299a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    QualType Result
4300a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      = getSema().Context.getDependentTemplateSpecializationType(
4301a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                TL.getTypePtr()->getKeyword(),
4302a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                         DTN->getQualifier(),
4303a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                         DTN->getIdentifier(),
4304a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                               NewTemplateArgs);
4305a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4306a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    DependentTemplateSpecializationTypeLoc NewTL
4307a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
4308a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setKeywordLoc(TL.getKeywordLoc());
430994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
431094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
4311a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setNameLoc(TL.getNameLoc());
4312a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setLAngleLoc(TL.getLAngleLoc());
4313a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setRAngleLoc(TL.getRAngleLoc());
4314a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4315a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4316a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    return Result;
4317a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  }
4318a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4319a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  QualType Result
4320a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    = getDerived().RebuildTemplateSpecializationType(Template,
4321a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                     TL.getNameLoc(),
4322a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                     NewTemplateArgs);
4323a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4324a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  if (!Result.isNull()) {
4325a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    /// FIXME: Wrap this in an elaborated-type-specifier?
4326a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    TemplateSpecializationTypeLoc NewTL
4327a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      = TLB.push<TemplateSpecializationTypeLoc>(Result);
4328a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setTemplateNameLoc(TL.getNameLoc());
4329a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setLAngleLoc(TL.getLAngleLoc());
4330a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setRAngleLoc(TL.getRAngleLoc());
4331a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4332a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4333a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  }
4334a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4335a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  return Result;
4336a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor}
4337a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
43381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
4340465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
434143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                ElaboratedTypeLoc TL) {
4342f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const ElaboratedType *T = TL.getTypePtr();
4343465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
43449e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  NestedNameSpecifierLoc QualifierLoc;
4345465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  // NOTE: the qualifier in an ElaboratedType is optional.
43469e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  if (TL.getQualifierLoc()) {
43479e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    QualifierLoc
43489e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
43499e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    if (!QualifierLoc)
4350465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return QualType();
4351465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
43521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
435343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
435443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  if (NamedT.isNull())
435543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    return QualType();
4356a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar
4357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
43599e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor      QualifierLoc != TL.getQualifierLoc() ||
4360e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      NamedT != T->getNamedType()) {
436121e413fe6305a198564d436ac515497716c47844John McCall    Result = getDerived().RebuildElaboratedType(TL.getKeywordLoc(),
43629e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                                T->getKeyword(),
43639e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                                QualifierLoc, NamedT);
4364a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4366a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
4367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4368465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
4369e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setKeywordLoc(TL.getKeywordLoc());
43709e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  NewTL.setQualifierLoc(QualifierLoc);
4371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
43731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43759d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType TreeTransform<Derived>::TransformAttributedType(
43769d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                                TypeLocBuilder &TLB,
43779d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                                AttributedTypeLoc TL) {
43789d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  const AttributedType *oldType = TL.getTypePtr();
43799d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
43809d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (modifiedType.isNull())
43819d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    return QualType();
43829d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
43839d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  QualType result = TL.getType();
43849d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
43859d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  // FIXME: dependent operand expressions?
43869d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (getDerived().AlwaysRebuild() ||
43879d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      modifiedType != oldType->getModifiedType()) {
43889d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    // TODO: this is really lame; we should really be rebuilding the
43899d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    // equivalent type from first principles.
43909d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    QualType equivalentType
43919d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      = getDerived().TransformType(oldType->getEquivalentType());
43929d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    if (equivalentType.isNull())
43939d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      return QualType();
43949d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
43959d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                               modifiedType,
43969d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                               equivalentType);
43979d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  }
43989d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
43999d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
44009d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  newTL.setAttrNameLoc(TL.getAttrNameLoc());
44019d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (TL.hasAttrOperand())
44029d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
44039d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (TL.hasAttrExprOperand())
44049d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    newTL.setAttrExprOperand(TL.getAttrExprOperand());
44059d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  else if (TL.hasAttrEnumOperand())
44069d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
44079d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
44089d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  return result;
44099d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
44109d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
44119d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCalltemplate<typename Derived>
4412075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType
4413075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraTreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
4414075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara                                           ParenTypeLoc TL) {
4415075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
4416075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (Inner.isNull())
4417075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return QualType();
4418075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
4419075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType Result = TL.getType();
4420075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (getDerived().AlwaysRebuild() ||
4421075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      Inner != TL.getInnerLoc().getType()) {
4422075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    Result = getDerived().RebuildParenType(Inner);
4423075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    if (Result.isNull())
4424075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      return QualType();
4425075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
4426075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
4427075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
4428075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  NewTL.setLParenLoc(TL.getLParenLoc());
4429075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  NewTL.setRParenLoc(TL.getRParenLoc());
4430075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  return Result;
4431075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara}
4432075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
4433075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaratemplate<typename Derived>
44344714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
443543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      DependentNameTypeLoc TL) {
4436f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DependentNameType *T = TL.getTypePtr();
4437833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
44382494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  NestedNameSpecifierLoc QualifierLoc
44392494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
44402494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  if (!QualifierLoc)
4441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
44421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
444333500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result
44442494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    = getDerived().RebuildDependentNameType(T->getKeyword(),
444533500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getKeywordLoc(),
44462494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                            QualifierLoc,
44472494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                            T->getIdentifier(),
444833500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getNameLoc());
4449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
4450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
4451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4452e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
4453e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    QualType NamedT = ElabT->getNamedType();
445433500955d731c73717af52088b7fc0e7a85681e7John McCall    TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
445533500955d731c73717af52088b7fc0e7a85681e7John McCall
4456e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
4457e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
44589e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    NewTL.setQualifierLoc(QualifierLoc);
445933500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
4460e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
4461e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
44622494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    NewTL.setQualifierLoc(QualifierLoc);
4463e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setNameLoc(TL.getNameLoc());
4464e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
4465a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
44671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
446933500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>::
447033500955d731c73717af52088b7fc0e7a85681e7John McCall          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
447143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                 DependentTemplateSpecializationTypeLoc TL) {
447294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  NestedNameSpecifierLoc QualifierLoc;
447394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (TL.getQualifierLoc()) {
447494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    QualifierLoc
447594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
447694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (!QualifierLoc)
4477a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      return QualType();
4478a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  }
4479a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
448043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return getDerived()
448194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor           .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
448243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall}
448343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
448443fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate<typename Derived>
448543fed0de4f5bc189e45562491f83d5193eb8dac0John McCallQualType TreeTransform<Derived>::
448694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorTransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
448794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                   DependentTemplateSpecializationTypeLoc TL,
448894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                       NestedNameSpecifierLoc QualifierLoc) {
448994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  const DependentTemplateSpecializationType *T = TL.getTypePtr();
449094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
449194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  TemplateArgumentListInfo NewTemplateArgs;
449294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
449394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
449494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
449594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  typedef TemplateArgumentLocContainerIterator<
449694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  DependentTemplateSpecializationTypeLoc> ArgIterator;
449794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
449894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                              ArgIterator(TL, TL.getNumArgs()),
449994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                              NewTemplateArgs))
450094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    return QualType();
450194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
450294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  QualType Result
450394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
450494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                              QualifierLoc,
450594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                            T->getIdentifier(),
450694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                            TL.getNameLoc(),
450794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                            NewTemplateArgs);
450894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (Result.isNull())
450994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    return QualType();
451094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
451194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
451294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    QualType NamedT = ElabT->getNamedType();
451394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
451494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // Copy information relevant to the template specialization.
451594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    TemplateSpecializationTypeLoc NamedTL
451694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
451794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NamedTL.setLAngleLoc(TL.getLAngleLoc());
451894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NamedTL.setRAngleLoc(TL.getRAngleLoc());
451994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
452094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
452194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
452294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // Copy information relevant to the elaborated type.
452394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
452494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NewTL.setKeywordLoc(TL.getKeywordLoc());
452594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NewTL.setQualifierLoc(QualifierLoc);
452694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  } else {
452794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    TypeLoc NewTL(Result, TL.getOpaqueData());
452894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    TLB.pushFullCopy(NewTL);
452994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  }
453094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  return Result;
453194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}
453294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
453394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregortemplate<typename Derived>
45347536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorQualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
45357536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor                                                      PackExpansionTypeLoc TL) {
45362fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  QualType Pattern
45372fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    = getDerived().TransformType(TLB, TL.getPatternLoc());
45382fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  if (Pattern.isNull())
45392fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    return QualType();
45402fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
45412fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  QualType Result = TL.getType();
45422fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  if (getDerived().AlwaysRebuild() ||
45432fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor      Pattern != TL.getPatternLoc().getType()) {
45442fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    Result = getDerived().RebuildPackExpansionType(Pattern,
45452fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor                                           TL.getPatternLoc().getSourceRange(),
4546cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                   TL.getEllipsisLoc(),
4547cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                           TL.getTypePtr()->getNumExpansions());
45482fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    if (Result.isNull())
45492fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor      return QualType();
45502fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  }
45512fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
45522fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
45532fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  NewT.setEllipsisLoc(TL.getEllipsisLoc());
45542fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  return Result;
45557536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
45567536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
45577536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregortemplate<typename Derived>
4558a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
4559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
456043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   ObjCInterfaceTypeLoc TL) {
4561ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCInterfaceType is never dependent.
4562c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
4563c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return TL.getType();
4564c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
4565c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
4566c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived>
4567c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType
4568c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
456943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                ObjCObjectTypeLoc TL) {
4570c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCObjectType is never dependent.
4571c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
4572ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
4573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
45741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
4577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
457843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                               ObjCObjectPointerTypeLoc TL) {
4579ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCObjectPointerType is never dependent.
4580c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
4581ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
458224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
458324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
4584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
458543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
458643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
458743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
458860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
45891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
45903fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(S);
459143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
459243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
459343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
459460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
459543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
459643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
459743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
459843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
459943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
460060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
46011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
460243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
46037114cbab7eb6e8b714eb22f014327daf2c741c08John McCall  bool SubStmtInvalid = false;
460443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
4605ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Statements(getSema());
460643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
460743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
460860d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Result = getDerived().TransformStmt(*B);
46097114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    if (Result.isInvalid()) {
46107114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // Immediately fail if this was a DeclStmt, since it's very
46117114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // likely that this will cause problems for future statements.
46127114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      if (isa<DeclStmt>(*B))
46137114cbab7eb6e8b714eb22f014327daf2c741c08John McCall        return StmtError();
46147114cbab7eb6e8b714eb22f014327daf2c741c08John McCall
46157114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // Otherwise, just keep processing substatements and fail later.
46167114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      SubStmtInvalid = true;
46177114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      continue;
46187114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    }
46191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
462043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
462143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
462243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
46231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46247114cbab7eb6e8b714eb22f014327daf2c741c08John McCall  if (SubStmtInvalid)
46257114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    return StmtError();
46267114cbab7eb6e8b714eb22f014327daf2c741c08John McCall
462743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
462843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
46293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
463043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
463143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
463243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
463343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
463443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
463543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
46361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
463743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
463860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
46391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
464060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS, RHS;
4641264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
4642264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
4643f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
46441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4645264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
4646264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
4647264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
4648f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
46491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4650264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
4651264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
4652264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
4653f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
4654264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
46551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
465643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
465743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
465843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
465960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
46609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       LHS.get(),
466143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
46629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       RHS.get(),
466343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
466443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
4665f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
46661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
466743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
466860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
466943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
4670f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
46711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
467243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
46739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
467443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
467543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
467643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
467760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
46781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
467943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
468060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
468143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
4682f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
46831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
468443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
468543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
46869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubStmt.get());
468743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
468943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
469060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
46911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
469260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
469343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
4694f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
46951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
469657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
469757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                        S->getDecl());
469857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  if (!LD)
469957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return StmtError();
470057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
470157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
470243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
4703ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  return getDerived().RebuildLabelStmt(S->getIdentLoc(),
470457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                       cast<LabelDecl>(LD), SourceLocation(),
470557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                       SubStmt.get());
470643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
47071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
470843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
470960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
47101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
471143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
471260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
47138cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
47148cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
4715c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
47168cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
4717aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
4718aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
4719aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
47208cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
4721f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
472299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
47238cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
4724c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
472599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
4726f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
4727eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
4728eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    // Convert the condition to a boolean value.
4729afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
47308491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(),
47318491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                                         Cond.get());
4732afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
4733f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
4734eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
47359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE.get();
4736afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
473799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
4738c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
47399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
47409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
4741f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
4742eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
474343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
474460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Then = getDerived().TransformStmt(S->getThen());
474543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
4746f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
47471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
474843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
474960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Else = getDerived().TransformStmt(S->getElse());
475043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
4751f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
47521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
475343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
47549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
475599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
475643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
475743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
47583fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
47591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4760eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
476144aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis                                    Then.get(),
47629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    S->getElseLoc(), Else.get());
476343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
476443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
476543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
476660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
47671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
476843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
476960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
4770d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
4771d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
4772c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
4773d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
4774aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
4775aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
4776aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
4777d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
4778f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
477999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
4780d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
4781c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
478299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
4783f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
478499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
47851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
478643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
478760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Switch
47889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
4789586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          ConditionVar);
479043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
4791f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
47921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
479343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
479460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
479543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
4796f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
47971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
479843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
47999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
48009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Body.get());
480143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
48021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
480343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
480460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
48051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
480643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
480760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
48085656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
48095656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
4810c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
48115656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
4812aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
4813aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
4814aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
48155656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
4816f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
481799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
48185656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
4819c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
482099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
4821f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
4822afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
4823afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
4824afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
48258491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(),
48268491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                                         Cond.get());
4827afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
4828f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
48299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE;
4830afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
483199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
48321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
48349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
4835f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
4836eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
483743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
483860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
483943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
4840f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
48411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
484243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
48439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
484499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
484543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
48469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(S);
48471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4848eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
48499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       ConditionVar, Body.get());
485043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
48511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
485243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
485360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
485443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
485543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
485660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
485743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
4858f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
48591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4860eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  // Transform the condition
486160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(S->getCond());
4862eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (Cond.isInvalid())
4863f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
4864eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
486543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
486643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
486743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
48683fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
48691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
48719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    /*FIXME:*/S->getWhileLoc(), Cond.get(),
487243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
487343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
48741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
487543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
487660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
48771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
487843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
487960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Init = getDerived().TransformStmt(S->getInit());
488043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
4881f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
48821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
488343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
488460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
488599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
488699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
4887c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
488899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
4889aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
4890aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
4891aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
489299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
4893f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
489499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
489599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
4896c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
489799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
4898f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
4899afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
4900afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
4901afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
49028491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(),
49038491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                                         Cond.get());
4904afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
4905f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
4906afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
49079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE.get();
4908afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
490999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
49101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
49129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
4913f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
4914eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
491543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
491660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Inc = getDerived().TransformExpr(S->getInc());
491743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
4918f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
49191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get()));
49219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (S->getInc() && !FullInc.get())
4922f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
4923eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
492443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
492560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
492643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
4927f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
49281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
492943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
493043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
49319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
493243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
493343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
49343fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
49351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
493643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
49379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Init.get(), FullCond, ConditionVar,
49389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     FullInc, S->getRParenLoc(), Body.get());
493943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
494043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
494143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
494260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
494457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
494557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                        S->getLabel());
494657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  if (!LD)
494757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return StmtError();
494857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
494943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
49501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
495157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                      cast<LabelDecl>(LD));
495243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
495343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
495443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
495560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
495760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Target = getDerived().TransformExpr(S->getTarget());
495843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
4959f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
49601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
496143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
496243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
49633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
496443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
496543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
49669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Target.get());
496743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
496843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
496943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
497060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
49723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(S);
497343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
49741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
497543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
497660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
49783fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(S);
497943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
49801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
498143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
498260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
498460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Result = getDerived().TransformExpr(S->getRetValue());
498543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
4986f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
498743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
49881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
498943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
49909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
499143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
49921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
499343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
499460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
499643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
499743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
499843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
499943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
5000aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
5001aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                         *D);
500243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
5003f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
50041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
500543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
500643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
50071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
500843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
500943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
50101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
501143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
50123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
50131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
501543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
501643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
50171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
501843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
501960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
502043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
5021c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5022ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Constraints(getSema());
5023ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Exprs(getSema());
5024ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 4> Names;
5025a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
502660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult AsmString;
5027ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Clobbers(getSema());
5028703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
5029703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  bool ExprsChanged = false;
5030c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5031703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the outputs.
5032703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
5033ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getOutputIdentifier(I));
5034c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5035703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
50363fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    Constraints.push_back(S->getOutputConstraintLiteral(I));
5037c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5038703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the output expr.
5039703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *OutputExpr = S->getOutputExpr(I);
504060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getDerived().TransformExpr(OutputExpr);
5041703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
5042f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5043c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5044703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != OutputExpr;
5045c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
50469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Exprs.push_back(Result.get());
5047703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
5048c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5049703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the inputs.
5050703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
5051ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getInputIdentifier(I));
5052c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5053703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
50543fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    Constraints.push_back(S->getInputConstraintLiteral(I));
5055c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5056703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the input expr.
5057703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *InputExpr = S->getInputExpr(I);
505860d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getDerived().TransformExpr(InputExpr);
5059703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
5060f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5061c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5062703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != InputExpr;
5063c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
50649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Exprs.push_back(Result.get());
5065703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
5066c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5067703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
50683fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
5069703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
5070703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the clobbers.
5071703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
50723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    Clobbers.push_back(S->getClobber(I));
5073703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
5074703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // No need to transform the asm string literal.
5075703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  AsmString = SemaRef.Owned(S->getAsmString());
5076703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
5077703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
5078703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isSimple(),
5079703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isVolatile(),
5080703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumOutputs(),
5081703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumInputs(),
5082a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson                                     Names.data(),
5083703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Constraints),
5084703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Exprs),
50859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     AsmString.get(),
5086703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Clobbers),
5087703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getRParenLoc(),
5088703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isMSAsm());
508943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
509043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
509143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
509243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
509360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
50941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
50954dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body of the @try.
509660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
50974dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (TryBody.isInvalid())
5098f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5099c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
51008f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  // Transform the @catch statements (if present).
51018f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool AnyCatchChanged = false;
5102ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> CatchStmts(SemaRef);
51038f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
510460d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
51054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Catch.isInvalid())
5106f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
51078f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    if (Catch.get() != S->getCatchStmt(I))
51088f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      AnyCatchChanged = true;
51098f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    CatchStmts.push_back(Catch.release());
51104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
5111c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
51124dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the @finally statement (if present).
511360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Finally;
51144dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (S->getFinallyStmt()) {
51154dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    Finally = getDerived().TransformStmt(S->getFinallyStmt());
51164dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Finally.isInvalid())
5117f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
51184dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
51194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
51204dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
51214dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
51224dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      TryBody.get() == S->getTryBody() &&
51238f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      !AnyCatchChanged &&
51244dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Finally.get() == S->getFinallyStmt())
51253fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
5126c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
51274dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
51289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
51299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           move_arg(CatchStmts), Finally.get());
513043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
51311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
513243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
513360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
51341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
5135be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  // Transform the @catch parameter, if there is one.
5136be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *Var = 0;
5137be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (VarDecl *FromVar = S->getCatchParamDecl()) {
5138be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    TypeSourceInfo *TSInfo = 0;
5139be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (FromVar->getTypeSourceInfo()) {
5140be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
5141be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (!TSInfo)
5142f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
5143be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
5144c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5145be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    QualType T;
5146be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (TSInfo)
5147be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = TSInfo->getType();
5148be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    else {
5149be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = getDerived().TransformType(FromVar->getType());
5150be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (T.isNull())
5151f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
5152be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
5153c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5154be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
5155be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (!Var)
5156f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5157be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
5158c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
515960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
5160be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (Body.isInvalid())
5161f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5162c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5163c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
5164be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             S->getRParenLoc(),
51659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Var, Body.get());
516643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
516843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
516960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
51701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
51714dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body.
517260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
51734dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (Body.isInvalid())
5174f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5175c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
51764dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
51774dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
51784dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Body.get() == S->getFinallyBody())
51793fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
51804dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
51814dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
51824dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
51839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                               Body.get());
518443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
51851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
518643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
518760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
51881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
518960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Operand;
5190d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (S->getThrowExpr()) {
5191d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    Operand = getDerived().TransformExpr(S->getThrowExpr());
5192d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    if (Operand.isInvalid())
5193f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5194d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
5195c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5196d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5197d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      Operand.get() == S->getThrowExpr())
51983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return getSema().Owned(S);
5199c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
52009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
520143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
52021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
520343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
520460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
520543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
52061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
52078fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the object we are locking.
520860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
52098fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Object.isInvalid())
5210f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5211c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
52128fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the body.
521360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
52148fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Body.isInvalid())
5215f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5216c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
52178fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // If nothing change, just retain the current statement.
52188fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
52198fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Object.get() == S->getSynchExpr() &&
52208fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Body.get() == S->getSynchBody())
52213fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
52228fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor
52238fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Build a new statement.
52248fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
52259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    Object.get(), Body.get());
522643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
522743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
522843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
522960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
523043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
52311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
5232c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the element statement.
523360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Element = getDerived().TransformStmt(S->getElement());
5234c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Element.isInvalid())
5235f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5236c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5237c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the collection expression.
523860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Collection = getDerived().TransformExpr(S->getCollection());
5239c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Collection.isInvalid())
5240f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5241c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5242c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the body.
524360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
5244c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Body.isInvalid())
5245f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5246c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5247c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // If nothing changed, just retain this statement.
5248c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
5249c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Element.get() == S->getElement() &&
5250c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Collection.get() == S->getCollection() &&
5251c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Body.get() == S->getBody())
52523fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
5253c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5254c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Build a new statement.
5255c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
5256c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   /*FIXME:*/S->getForLoc(),
52579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Element.get(),
52589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Collection.get(),
5259c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   S->getRParenLoc(),
52609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Body.get());
526143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
526243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
526343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
526443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
526560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
526643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
526743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
526843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
526943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
527043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
527183cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor    TypeSourceInfo *T = getDerived().TransformType(
527283cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor                                            ExceptionDecl->getTypeSourceInfo());
527383cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor    if (!T)
5274f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
52751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
527683cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T,
527743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
527883cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor                                            ExceptionDecl->getLocation());
5279ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor    if (!Var || Var->isInvalidDecl())
5280f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
528143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
52821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
528343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
528460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
5285ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor  if (Handler.isInvalid())
5286f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
52871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
528843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
528943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
529043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
52913fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
529243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
529343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
529443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
52959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Handler.get());
529643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
52971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
529843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
529960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
530043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
530143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
530260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TryBlock
530343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
530443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
5305f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
53061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
530743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
530843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
5309ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Handlers(SemaRef);
531043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
531160d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Handler
531243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
531343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
5314f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
53151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
531643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
531743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
531843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
53191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
532043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
532143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
532243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
53233fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
532443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
53259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
53261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
532743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
53281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
532943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
5330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
5331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
53321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
533360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5334454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
53353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
53361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
53371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
533960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5340454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
534140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  NestedNameSpecifierLoc QualifierLoc;
534240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  if (E->getQualifierLoc()) {
534340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    QualifierLoc
534440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
534540d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    if (!QualifierLoc)
5346f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5347a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
5348dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
5349dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
53507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
53517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getDecl()));
5352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
5353f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
53541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5355ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  DeclarationNameInfo NameInfo = E->getNameInfo();
5356ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  if (NameInfo.getName()) {
5357ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
5358ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    if (!NameInfo.getName())
5359f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5360ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  }
53612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
53622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!getDerived().AlwaysRebuild() &&
536340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      QualifierLoc == E->getQualifierLoc() &&
5364a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
53652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NameInfo.getName() == E->getDecl()->getDeclName() &&
5366096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
53671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5368dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
5369dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
5370dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
5371a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
53723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
5373a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
5374dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
5375dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
5376096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
5377dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
5378dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
5379dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
5380fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
5381fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                E->getNumTemplateArgs(),
5382fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                TransArgs))
5383fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor      return ExprError();
5384dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
5385dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
538640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
538740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                                         TemplateArgs);
5388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
539160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5392454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
53933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
53951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
539760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5398454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
53993fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
540360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5404454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
54053fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
540960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5410454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
54113fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
541560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5416454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
54173fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
542160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5422454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
542360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5425f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
54261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
54283fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
54291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
5431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
5432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
54341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
543560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5436454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
543760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5439f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
54401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
54423fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
54431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
5445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
54469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get());
5447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
54481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
545060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
54518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
54528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform the type.
54538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
54548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!Type)
5455f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
5456c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform all of the components into components similar to what the
54588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // parser uses.
5459c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // FIXME: It would be slightly more efficient in the non-dependent case to
5460c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // just map FieldDecls, rather than requiring the rebuilder to look for
5461c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // the fields again. However, __builtin_offsetof is rare enough in
54628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // template code that we don't care.
54638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool ExprChanged = false;
5464f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  typedef Sema::OffsetOfComponent Component;
54658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
54668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  llvm::SmallVector<Component, 4> Components;
54678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
54688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    const Node &ON = E->getComponent(I);
54698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Component Comp;
547072be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor    Comp.isBrackets = true;
54718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocStart = ON.getRange().getBegin();
54728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocEnd = ON.getRange().getEnd();
54738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
54748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array: {
54758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
547660d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Index = getDerived().TransformExpr(FromIndex);
54778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (Index.isInvalid())
5478f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
5479c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      ExprChanged = ExprChanged || Index.get() != FromIndex;
54818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = true;
54829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Comp.U.E = Index.get();
54838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
54848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
5485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
54878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
54888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = false;
54898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.IdentInfo = ON.getFieldName();
549029d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor      if (!Comp.U.IdentInfo)
549129d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor        continue;
5492c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
5494c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5495cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case Node::Base:
5496cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Will be recomputed during the rebuild.
5497cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
54988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
5499c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
55008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Components.push_back(Comp);
55018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
5502c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
55038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // If nothing changed, retain the existing expression.
55048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
55058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Type == E->getTypeSourceInfo() &&
55068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      !ExprChanged)
55073fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
5508c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
55098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Build a new offsetof expression.
55108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
55118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          Components.data(), Components.size(),
55128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          E->getRParenLoc());
55137cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall}
55147cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
55157cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCalltemplate<typename Derived>
55167cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallExprResult
55177cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallTreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
55187cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  assert(getDerived().AlreadyTransformed(E->getType()) &&
55197cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall         "opaque value expression requires transformation");
55207cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  return SemaRef.Owned(E);
55218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
55228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
55238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived>
552460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5525454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
5526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
5527a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
55285557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
5529a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
55305ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
5531f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
55321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55335ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
55343fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
55351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55365ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
55371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
5538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
5539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
55401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
554160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr;
55421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
5543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
5544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
5545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
5546f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
55471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
5550f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
55511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
55533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
5554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
55551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildSizeOfAlignOf(SubExpr.get(), E->getOperatorLoc(),
5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
5559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
556260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5563454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
556460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
5566f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
55671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
556860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
5569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
5570f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
55711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
5575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
55763fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
55771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildArraySubscriptExpr(LHS.get(),
5579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
55809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                RHS.get(),
5581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
5582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
558560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5586454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
5587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
558860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
5589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
5590f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
5591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
5593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
5594ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
5595aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
5596aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  &ArgChanged))
5597aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
5598aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
5599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
5601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
56023fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
56031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
56051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
5606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
56079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
5608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
5609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
561360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5614454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
561560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
5616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
5617f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
56181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
561940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  NestedNameSpecifierLoc QualifierLoc;
562083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
562140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    QualifierLoc
562240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
562340d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor
562440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    if (!QualifierLoc)
5625f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
562683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
56271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5628f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
56297c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
56307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getMemberDecl()));
5631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
5632f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
56331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56346bb8017bb9e828d118e15e59d71c66bba323c364John McCall  NamedDecl *FoundDecl = E->getFoundDecl();
56356bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (FoundDecl == E->getMemberDecl()) {
56366bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = Member;
56376bb8017bb9e828d118e15e59d71c66bba323c364John McCall  } else {
56386bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = cast_or_null<NamedDecl>(
56396bb8017bb9e828d118e15e59d71c66bba323c364John McCall                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
56406bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!FoundDecl)
5641f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
56426bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
56436bb8017bb9e828d118e15e59d71c66bba323c364John McCall
5644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
564640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      QualifierLoc == E->getQualifierLoc() &&
56478a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
56486bb8017bb9e828d118e15e59d71c66bba323c364John McCall      FoundDecl == E->getFoundDecl() &&
5649096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
5650c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
56511f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
56521f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
56531f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
56543fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
56551f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
5656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5657d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
5658096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
5659d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
5660d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
5661fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
5662fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                E->getNumTemplateArgs(),
5663fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                TransArgs))
5664fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor      return ExprError();
56658a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
5666c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
5668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
5669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
5670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5671c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5672c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5673c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5674c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5675c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5676c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
56779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
5678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
567940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                                        QualifierLoc,
56802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                        E->getMemberNameInfo(),
56818a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
56826bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                        FoundDecl,
5683096832c5ed5b9106fa177ebc148489760c3bc496John McCall                                        (E->hasExplicitTemplateArgs()
5684d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
5685c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
5686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
568960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5690454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
569160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
5692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
5693f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
56941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
569560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
5696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
5697f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
56981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
5701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
57023fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
57031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
57059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            LHS.get(), RHS.get());
5706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
57081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
570960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
5711454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
5712454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
5713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
571656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallExprResult TreeTransform<Derived>::
571756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallTransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
571856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // Just rebuild the common and RHS expressions and see whether we
571956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // get any changes.
572056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
572156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
572256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (commonExpr.isInvalid())
572356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return ExprError();
572456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
572556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
572656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (rhs.isInvalid())
572756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return ExprError();
572856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
572956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (!getDerived().AlwaysRebuild() &&
573056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      commonExpr.get() == e->getCommon() &&
573156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      rhs.get() == e->getFalseExpr())
573256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return SemaRef.Owned(e);
573356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
573456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  return getDerived().RebuildConditionalOperator(commonExpr.take(),
573556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                 e->getQuestionLoc(),
573656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                 0,
573756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                 e->getColonLoc(),
573856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                 rhs.get());
573956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
574056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
574156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCalltemplate<typename Derived>
574260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5743454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
574460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(E->getCond());
5745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
5746f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
57471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
574860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
5749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
5750f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
57511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
575260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
5753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
5754f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
57551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
5758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
5759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
57603fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
57611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildConditionalOperator(Cond.get(),
576347e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
57649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 LHS.get(),
576547e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
57669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 RHS.get());
5767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
577060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5771454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
5772a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
5773a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
57746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
5775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
577860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5779454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
5780ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
5781ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  if (!Type)
5782ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor    return ExprError();
5783ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor
578460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
57856eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5787f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
57881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5790ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor      Type == E->getTypeInfoAsWritten() &&
5791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
57923fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
57931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57949d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
5795ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor                                            Type,
5796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
57979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            SubExpr.get());
5798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
580160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5802454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
580342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
580442f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
580542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
5806f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
58071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
580860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Init = getDerived().TransformExpr(E->getInitializer());
5809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
5810f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
58111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
581342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      OldT == NewT &&
5814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
58153fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
5816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
58171d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // Note: the expression type doesn't necessarily match the
58181d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // type-as-written, but that's okay, because it should always be
58191d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // derivable from the initializer.
58201d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
582142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
5822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
58239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Init.get());
5824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
58251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
582760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5828454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
582960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
5830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
5831f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
58321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
58353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
58361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
58381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
5839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
58409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
5841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
5842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
5843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
58441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
584660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5847454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
5848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
58491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5850ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> Inits(SemaRef);
5851aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
5852aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  Inits, &InitChanged))
5853aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
5854aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
5855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
58563fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
58571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
5859e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
5860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
58611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
586360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5864454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
5865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
58661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
586743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
586860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Init = getDerived().TransformExpr(E->getInit());
5869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
5870f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
58711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
587243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
5873ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef);
5874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
5875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
5876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
5877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
5878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
5879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
5880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
5881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
5882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
5883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
58841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
588660d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
5887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
5888f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
58891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
5891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
58921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
5894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
5895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
5896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
58971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
589960d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Start
5900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
5901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
5902f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
59031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
590460d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
5905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
5906f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
59071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
59081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
5909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
5910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
5911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
59121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
5914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
59151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
5917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
5918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
59191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
5922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
59233fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
59241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
5926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
59279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                E->usesGNUSyntax(), Init.get());
5928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
593160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
5933454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
59345557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5935c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
59365557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
59375557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
5938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5940f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
59411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
59443fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
59451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
5947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
595060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5951454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
59529bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
59539bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo)
5954f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
59551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
595660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5958f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
59591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
59612cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara      TInfo == E->getWrittenTypeInfo() &&
5962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
59633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
59641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
59659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
59662cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                       TInfo, E->getRParenLoc());
5967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
597060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5971454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
5972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5973ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> Inits(SemaRef);
5974aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
5975aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                     &ArgumentChanged))
5976aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
5977aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
5978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
5979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
5980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
5981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
5984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
5985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
5986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
5987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
5988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
598960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5990454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
599157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
599257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                        E->getLabel());
599357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  if (!LD)
599457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return ExprError();
599557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
5996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
599757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                           cast<LabelDecl>(LD));
5998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
600160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6002454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
600360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt
6004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
6005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
6006f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
60071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
60103fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
60111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
60139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      SubStmt.get(),
6014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
6015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
601860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6019454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
602060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(E->getCond());
6021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
6022f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
60231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
602460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
6025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
6026f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
60271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
602860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
6029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
6030f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
60311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
6034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
6035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
60363fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
60371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
60399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Cond.get(), LHS.get(), RHS.get(),
6040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
6041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
604460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6045454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
60463fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
6047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
605060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6051454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
6052668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
6053668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
6054668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
6055668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
6056668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
6057668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
6058f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6059c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6060668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
6061668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
6062668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
6063668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6064668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
606560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Object = getDerived().TransformExpr(E->getArg(0));
6066668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
6067f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6068668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6069668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
6070668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
6071668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
6072668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
6073668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6074668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
6075ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> Args(SemaRef);
6076aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
6077aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                    Args))
6078aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      return ExprError();
6079668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
60809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
6081668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
6082668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
6083668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
6084668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6085668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
6086668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
6087668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
6088668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
6089668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
6090668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
6091668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
6092668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6093668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
6094668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
6095f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6096668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6097668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
6098668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
6099668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
6100f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6101668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
6102668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
610360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
6104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
6105f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
61061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
610760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult First = getDerived().TransformExpr(E->getArg(0));
6108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
6109f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
611160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Second;
6112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
6113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
6114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
6115f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
61171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
6120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
61211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
61223fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
61231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
6125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
61269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Callee.get(),
61279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 First.get(),
61289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Second.get());
6129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
61301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
613260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6133454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
6134454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
6135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
61361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6138e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneExprResult
6139e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneTreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
6140e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  // Transform the callee.
6141e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
6142e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  if (Callee.isInvalid())
6143e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    return ExprError();
6144e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6145e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  // Transform exec config.
6146e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
6147e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  if (EC.isInvalid())
6148e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    return ExprError();
6149e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6150e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  // Transform arguments.
6151e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  bool ArgChanged = false;
6152e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  ASTOwningVector<Expr*> Args(SemaRef);
6153e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
6154e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                  &ArgChanged))
6155e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    return ExprError();
6156e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6157e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  if (!getDerived().AlwaysRebuild() &&
6158e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne      Callee.get() == E->getCallee() &&
6159e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne      !ArgChanged)
6160e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    return SemaRef.Owned(E);
6161e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6162e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  // FIXME: Wrong source location information for the '('.
6163e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  SourceLocation FakeLParenLoc
6164e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    = ((Expr *)Callee.get())->getSourceRange().getBegin();
6165e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
6166e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                      move_arg(Args),
6167e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                      E->getRParenLoc(), EC.get());
6168e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}
6169e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6170e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournetemplate<typename Derived>
617160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6172454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
6173ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
6174ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  if (!Type)
6175ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor    return ExprError();
6176ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor
617760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
61786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
6179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6180f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
61811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6183ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor      Type == E->getTypeInfoAsWritten() &&
6184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
61853fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
61861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
61881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
6189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
6190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
6191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
6192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
6193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
6194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
61951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
6196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
6197ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor                                              Type,
6198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
6199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
62009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              SubExpr.get(),
6201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
6202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
620560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6206454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
6207454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
6208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
621160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6212454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
6213454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
6214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
621760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
6219454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
6220454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
6221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
622460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6225454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
6226454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
6227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
623060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
6232454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
6233ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
6234ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  if (!Type)
6235ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor    return ExprError();
62361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
623760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
62386eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
6239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6240f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
62411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6243ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor      Type == E->getTypeInfoAsWritten() &&
6244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
62453fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
62461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6247ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(Type,
6248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
62499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr.get(),
6250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
6251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
625460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6255454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
6256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
625757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    TypeSourceInfo *TInfo
625857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor      = getDerived().TransformType(E->getTypeOperandSourceInfo());
625957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    if (!TInfo)
6260f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
62611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
626357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor        TInfo == E->getTypeOperandSourceInfo())
62643fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
62651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
626657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getType(),
626757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             E->getLocStart(),
626857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             TInfo,
6269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
6270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
62711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
6273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
6274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
62751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
6276f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                      Sema::PotentiallyPotentiallyEvaluated);
62771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
627860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
6279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6280f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
62811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
62843fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
62851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
628657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getType(),
628757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                           E->getLocStart(),
62889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get(),
6289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
6290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
629360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
629401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetTreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
629501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (E->isTypeOperand()) {
629601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    TypeSourceInfo *TInfo
629701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      = getDerived().TransformType(E->getTypeOperandSourceInfo());
629801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    if (!TInfo)
629901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      return ExprError();
630001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
630101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    if (!getDerived().AlwaysRebuild() &&
630201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet        TInfo == E->getTypeOperandSourceInfo())
63033fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
630401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
630501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return getDerived().RebuildCXXTypeidExpr(E->getType(),
630601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                             E->getLocStart(),
630701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                             TInfo,
630801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                             E->getLocEnd());
630901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
631001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
631101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  // We don't know whether the expression is potentially evaluated until
631201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  // after we perform semantic analysis, so the expression is potentially
631301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  // potentially evaluated.
631401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
631501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
631601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
631701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (SubExpr.isInvalid())
631801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return ExprError();
631901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
632001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (!getDerived().AlwaysRebuild() &&
632101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      SubExpr.get() == E->getExprOperand())
63223fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
632301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
632401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  return getDerived().RebuildCXXUuidofExpr(E->getType(),
632501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                           E->getLocStart(),
632601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                           SubExpr.get(),
632701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                           E->getLocEnd());
632801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}
632901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
633001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichettemplate<typename Derived>
633101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetExprResult
6332454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
63333fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
6334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
63351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
633760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
6339454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
63403fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
6341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
63421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
634460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6345454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
6346ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  DeclContext *DC = getSema().getFunctionLevelDeclContext();
6347ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC);
6348ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  QualType T = MD->getThisType(getSema().Context);
63491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6350ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  if (!getDerived().AlwaysRebuild() && T == E->getType())
63513fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
63521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6353828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
6354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
63551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
635760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6358454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
635960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
6360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6361f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
63621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
63653fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
6366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get());
6368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
63691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
637160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6372454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
63731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
63747c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
63757c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
6376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
6377f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
63781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
637953cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
6380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
63813fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
63821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6383036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
6384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
63851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
638760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6388ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr(
6389ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                                    CXXScalarValueInitExpr *E) {
6390ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
6391ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
6392f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6393ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
6394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6395ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo())
63963fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
63971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6398ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXScalarValueInitExpr(T,
6399ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          /*FIXME:*/T->getTypeLoc().getEndLoc(),
6400ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    E->getRParenLoc());
6401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
64021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
640460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6405454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
6406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
64071bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  TypeSourceInfo *AllocTypeInfo
64081bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor    = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
64091bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  if (!AllocTypeInfo)
6410f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
64111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
641360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
6414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
6415f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
64161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
6418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6419ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> PlacementArgs(SemaRef);
6420aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getPlacementArgs(),
6421aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  E->getNumPlacementArgs(), true,
6422aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  PlacementArgs, &ArgumentChanged))
6423aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
64241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
642543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
6426ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> ConstructorArgs(SemaRef);
6427aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (TransformExprs(E->getConstructorArgs(), E->getNumConstructorArgs(), true,
6428aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                     ConstructorArgs, &ArgumentChanged))
6429aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
64301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
64321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
64331af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
64341af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
64357c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
64367c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
64371af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
6438f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
64391af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
64401af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
64411af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
64421af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
64431af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
64447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
64457c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
64461af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
6447f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
64481af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
64491af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
64501af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
64511af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
64521af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
64537c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
64547c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
64551af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
6456f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
64571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
6458c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
64601bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor      AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
6461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
64621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
64631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
64641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
64651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
64661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
64671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
64681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
64691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
64701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
64711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
64721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
64731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
64743fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
64751af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
64761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64771bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  QualType AllocType = AllocTypeInfo->getType();
64785b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
64795b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
64805b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
64815b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
64825b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
64835b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
64845b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
64855b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
64865b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
64875b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
64885b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
6489c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      ArraySize
64909996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis        = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context,
64919996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               ConsArrayT->getSize(),
64929996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               SemaRef.Context.getSizeType(),
64939996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               /*FIXME:*/E->getLocStart()));
64945b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
64955b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
64965b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
64975b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
64983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr());
64995b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
65005b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
65015b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
65025b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
65031bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor
6504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
6505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
6506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
6507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
6508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
65094bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                        E->getTypeIdParens(),
6510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
65111bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                        AllocTypeInfo,
65129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        ArraySize.get(),
6513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
6514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
65151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
6516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
65171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
651960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6520454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
652160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Operand = getDerived().TransformExpr(E->getArgument());
6522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
6523f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
65241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65251af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
65261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
65271af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
65281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
65297c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
65307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
65311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
6532f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
65331af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
6534c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
65361af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
65371af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
65381af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
65391af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
65401af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
65411af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
65425833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
65435833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    if (!E->getArgument()->isTypeDependent()) {
65445833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor      QualType Destroyed = SemaRef.Context.getBaseElementType(
65455833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor                                                         E->getDestroyedType());
65465833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor      if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
65475833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor        CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
65485833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor        SemaRef.MarkDeclarationReferenced(E->getLocStart(),
65495833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor                                          SemaRef.LookupDestructor(Record));
65505833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor      }
65515833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    }
65525833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
65533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
65541af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
65551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
6557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
6558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
65599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Operand.get());
6560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
65611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
656360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6564a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
6565454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
656660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6567a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
6568f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
65691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6570b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  ParsedType ObjectTypePtr;
6571a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
65729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
6573a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
6574a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
6575a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
6576a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
6577a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
6578f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6579c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6580b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  QualType ObjectType = ObjectTypePtr.get();
6581f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
6582f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  if (QualifierLoc) {
6583f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor    QualifierLoc
6584f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
6585f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor    if (!QualifierLoc)
658643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      return ExprError();
658743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  }
6588f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  CXXScopeSpec SS;
6589f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  SS.Adopt(QualifierLoc);
65901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6591a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
6592a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
6593a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
659443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
6595b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                ObjectType, 0, SS);
6596a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
6597f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6598a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
6599a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
6600a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
6601a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
6602a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
6603a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
6604a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
6605a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
6606b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
6607a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
6608a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
6609a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
6610a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
6611a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
6612a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
6613f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6614c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6615a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
6616a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
6617a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
6618a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
661926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
662026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
662126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
662243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo());
662326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
6624f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6625a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
6626c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
66279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
6628a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
6629a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
6630f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                                     SS,
663126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
663226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
6633fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
6634a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
6635a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
66361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6637a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
663860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6639ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
6640454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
6641f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
6642f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
6643f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6644f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
6645f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
6646f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
66477c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
66487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
66497c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
66509f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
66519f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
66529f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
66539f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
66549f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
66559f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
6656f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
66579f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
6658f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6659f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
6660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
6661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
6662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
6663f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
6664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
6665f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
6666f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
6667f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6668f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
6669f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
6670f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6671f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
6672f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
6673f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
6674f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6675f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
6676f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
66774c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  if (Old->getQualifierLoc()) {
66784c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    NestedNameSpecifierLoc QualifierLoc
66794c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
66804c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    if (!QualifierLoc)
6681f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6682c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
66834c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    SS.Adopt(QualifierLoc);
6684c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  }
6685c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6686c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (Old->getNamingClass()) {
668766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    CXXRecordDecl *NamingClass
668866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
668966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                            Old->getNameLoc(),
669066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
669166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
6692f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6693c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
669466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
6695f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
6696f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6697f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
6698f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
6699f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
6700f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6701f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
6702f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
6703f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
6704fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
6705fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              Old->getNumTemplateArgs(),
6706fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              TransArgs))
6707fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    return ExprError();
6708f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6709f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
6710f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
6711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
67121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
671460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6715454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
67163d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
67173d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor  if (!T)
6718f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
67191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
67213d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor      T == E->getQueriedTypeSourceInfo())
67223fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
67231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
6725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
6726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
6727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
6728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
67291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
673160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
67326ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetTreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
67336ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo());
67346ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  if (!LhsT)
67356ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return ExprError();
67366ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
67376ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo());
67386ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  if (!RhsT)
67396ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return ExprError();
67406ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
67416ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  if (!getDerived().AlwaysRebuild() &&
67426ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet      LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo())
67436ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return SemaRef.Owned(E);
67446ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
67456ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  return getDerived().RebuildBinaryTypeTrait(E->getTrait(),
67466ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                            E->getLocStart(),
67476ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                            LhsT, RhsT,
67486ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                            E->getLocEnd());
67496ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet}
67506ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
67516ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichettemplate<typename Derived>
67526ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetExprResult
6753865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
67542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               DependentScopeDeclRefExpr *E) {
675500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  NestedNameSpecifierLoc QualifierLoc
675600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
675700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  if (!QualifierLoc)
6758f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
67591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
676043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // TODO: If this is a conversion-function-id, verify that the
676143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // destination type name (if present) resolves the same way after
676243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // instantiation as it did in the local scope.
676343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
67642577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
67652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
67662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
6767f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
67681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6769f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
6770f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
677100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor        QualifierLoc == E->getQualifierLoc() &&
67722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // Note: it is sufficient to compare the Name component of NameInfo:
67732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // if name has not changed, DNLoc has not changed either.
67742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getDeclName())
67753fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
67761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
677700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor    return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc,
67782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                         NameInfo,
6779f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
6780f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
6781d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
6782d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
6783fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
6784fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              E->getNumTemplateArgs(),
6785fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              TransArgs))
6786fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    return ExprError();
6787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
678800cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc,
67892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
6790f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
6791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
679460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6795454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
6796321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
6797321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
6798321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
6799321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
6800321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
6801321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
6802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
6803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
6805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
6806f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
6809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
68107c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
68117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
6812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
6813f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
68141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6816ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
6817aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
6818aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  &ArgumentChanged))
6819aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
6820aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
6821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
6823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
6824c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
68251af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
68261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
6827c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
68283fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
6829c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
68301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68314411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
68324411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
68338c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              move_arg(Args),
68348c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              E->requiresZeroInitialization(),
6835428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                              E->getConstructionKind(),
6836428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                              E->getParenRange());
6837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
68381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
6840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
68415132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
68425132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
6843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
684460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6845454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
68465132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
6847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
68481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68494765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// \brief Transform a C++ expression that contains cleanups that should
68504765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// be run after the expression is evaluated.
6851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
68524765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// Since ExprWithCleanups nodes are implicitly generated, we
68535132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
6854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
685560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
68564765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallTreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
68575132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
6858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
68591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
686160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
6863ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                                    CXXTemporaryObjectExpr *E) {
6864ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
6865ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
6866f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
68671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
6869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
6870c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                  getDerived().TransformDecl(E->getLocStart(),
68717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
6872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
6873f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
68741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6876ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
6877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
6878aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
6879aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                     &ArgumentChanged))
6880aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
68811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6883ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo() &&
6884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
688591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
688691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
6887ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
68883fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.MaybeBindToTemporary(E);
688991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
6890ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
6891ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(T,
6892ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          /*FIXME:*/T->getTypeLoc().getEndLoc(),
6893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
6894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
6895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
68961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
689860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
6900454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
6901ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
6902ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
6903f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
69041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6906ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
6907aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Args.reserve(E->arg_size());
6908aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
6909aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  &ArgumentChanged))
6910aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
6911aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
6912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6913ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo() &&
6914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
69153fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
69161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
6918ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(T,
6919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
6920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
6921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
6922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
69231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
692560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6926865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
69272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                             CXXDependentScopeMemberExpr *E) {
6928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
692960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base((Expr*) 0);
6930aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
6931aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
6932aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
6933aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
6934aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
6935aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
6936aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
6937f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
69381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6939aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
6940b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ParsedType ObjectTy;
6941d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
69429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
6943aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
6944a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
6945d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
6946d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
6947aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
6948f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6949aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
6950b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ObjectType = ObjectTy.get();
6951aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
6952aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
6953aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
6954aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
6955aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
6956aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
69571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
69596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
6960c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
69616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
69627c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                            E->getFirstQualifierFoundInScope(),
69637c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                            E->getQualifierLoc().getBeginLoc());
69641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69657c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  NestedNameSpecifierLoc QualifierLoc;
6966a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
69677c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    QualifierLoc
69687c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
69697c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                     ObjectType,
69707c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                     FirstQualifierInScope);
69717c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    if (!QualifierLoc)
6972f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6973a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
69741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
697543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // TODO: If this is a conversion-function-id, verify that the
697643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // destination type name (if present) resolves the same way after
697743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // instantiation as it did in the local scope.
697843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
69792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
698043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
69812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
6982f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
69831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6984aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
69853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
69863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
69873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
6988aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
6989aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
69907c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor        QualifierLoc == E->getQualifierLoc() &&
69912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getMember() &&
69923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
69933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
69941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
6996aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
69973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
69983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
69997c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                       QualifierLoc,
7000129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
70012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
7002129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
70033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
70043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
7005d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
7006fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7007fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              E->getNumTemplateArgs(),
7008fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              TransArgs))
7009fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    return ExprError();
70101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
7012aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
7013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
7014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
70157c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                     QualifierLoc,
70163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
70172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                     NameInfo,
7018129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
7019129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
7020129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7021129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
702260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7023454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
7024129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
702560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base((Expr*) 0);
7026aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
7027aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
7028aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
7029aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
7030f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7031aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
7032aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
7033aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
7034aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
7035129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
70364c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  NestedNameSpecifierLoc QualifierLoc;
70374c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  if (Old->getQualifierLoc()) {
70384c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    QualifierLoc
70394c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
70404c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    if (!QualifierLoc)
7041f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7042129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
7043129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
70442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  LookupResult R(SemaRef, Old->getMemberNameInfo(),
7045129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
7046129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7047129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
7048129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
7049129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
70507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
70517c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
70527c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
70539f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
70549f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
70559f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
70569f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
70579f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
70589f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
7059f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
70609f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
7061129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7062129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
7063129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
7064129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
7065129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
7066129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
7067129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
7068129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
7069129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
7070129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7071129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
7072129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
7073129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7074129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
7075129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7076c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  // Determine the naming class.
7077042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth  if (Old->getNamingClass()) {
7078c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    CXXRecordDecl *NamingClass
7079c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
708066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                          Old->getMemberLoc(),
708166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
708266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
7083f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7084c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
708566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
7086c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
7087c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7088129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
7089129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
7090129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
7091129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
7092fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
7093fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                Old->getNumTemplateArgs(),
7094fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                TransArgs))
7095fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor      return ExprError();
7096129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
7097c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
7098c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
7099c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
7100c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
7101c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
7102c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
7103c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
71049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
7105aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
7106129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
7107129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
71084c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                                                  QualifierLoc,
7109c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
7110129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
7111129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
7112129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
7113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
7115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
711660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
71172e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlTreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
71182e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
71192e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  if (SubExpr.isInvalid())
71202e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl    return ExprError();
71212e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
71222e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
71233fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
71242e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
71252e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
71262e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl}
71272e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
71282e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redltemplate<typename Derived>
71292e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlExprResult
7130be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorTreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
71314f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
71324f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  if (Pattern.isInvalid())
71334f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor    return ExprError();
71344f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor
71354f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
71364f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor    return SemaRef.Owned(E);
71374f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor
713867fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
713967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                           E->getNumExpansions());
7140be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}
7141ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7142ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregortemplate<typename Derived>
7143ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorExprResult
7144ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorTreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
7145ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // If E is not value-dependent, then nothing will change when we transform it.
7146ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // Note: This is an instantiation-centric view.
7147ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  if (!E->isValueDependent())
7148ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return SemaRef.Owned(E);
7149ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7150ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // Note: None of the implementations of TryExpandParameterPacks can ever
7151ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // produce a diagnostic when given only a single unexpanded parameter pack,
7152ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // so
7153ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
7154ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  bool ShouldExpand = false;
7155d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  bool RetainExpansion = false;
7156cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  llvm::Optional<unsigned> NumExpansions;
7157ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
7158ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                           &Unexpanded, 1,
7159d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                           ShouldExpand, RetainExpansion,
7160d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                           NumExpansions))
7161ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return ExprError();
7162ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7163d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  if (!ShouldExpand || RetainExpansion)
7164ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return SemaRef.Owned(E);
7165be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
7166ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // We now know the length of the parameter pack, so build a new expression
7167ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // that stores that length.
7168ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
7169ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                            E->getPackLoc(), E->getRParenLoc(),
7170cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                            *NumExpansions);
7171ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
7172ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7173be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregortemplate<typename Derived>
7174be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorExprResult
7175c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorTreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
7176c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                          SubstNonTypeTemplateParmPackExpr *E) {
7177c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  // Default behavior is to do nothing with this transformation.
7178c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  return SemaRef.Owned(E);
7179c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}
7180c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
7181c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregortemplate<typename Derived>
7182c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorExprResult
7183454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
71843fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
7185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
71871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
718860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7189454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
719081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *EncodedTypeInfo
719181d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
719281d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!EncodedTypeInfo)
7193f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
71941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
719681d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
71973fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
7199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
720081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                            EncodedTypeInfo,
7201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
7202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
72031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
720560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7206454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
720792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Transform arguments.
720892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  bool ArgChanged = false;
7209ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
7210aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Args.reserve(E->getNumArgs());
7211aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
7212aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  &ArgChanged))
7213aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
7214aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
721592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
721692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Class message: transform the receiver type.
721792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    TypeSourceInfo *ReceiverTypeInfo
721892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      = getDerived().TransformType(E->getClassReceiverTypeInfo());
721992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!ReceiverTypeInfo)
7220f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7221c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
722292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If nothing changed, just retain the existing message send.
722392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
722492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
72253fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
722692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
722792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Build a new class message send.
722892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
722992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getSelector(),
7230f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                               E->getSelectorLoc(),
723192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getMethodDecl(),
723292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getLeftLoc(),
723392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               move_arg(Args),
723492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getRightLoc());
723592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
723692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
723792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Instance message: transform the receiver
723892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
723992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor         "Only class and instance messages may be instantiated");
724060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Receiver
724192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    = getDerived().TransformExpr(E->getInstanceReceiver());
724292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (Receiver.isInvalid())
7243f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
724492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
724592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // If nothing changed, just retain the existing message send.
724692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
724792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
72483fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7249c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
725092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Build a new instance message send.
72519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCMessageExpr(Receiver.get(),
725292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getSelector(),
7253f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                             E->getSelectorLoc(),
725492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getMethodDecl(),
725592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getLeftLoc(),
725692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             move_arg(Args),
725792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getRightLoc());
7258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
72601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
726160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7262454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
72633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
7264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
72661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
726760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7268454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
72693fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
7270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
72721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
727360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7274454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
7275f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
727660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
7277f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
7278f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
7279f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor
7280f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // We don't need to transform the ivar; it will never change.
7281c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7282f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
7283f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
7284f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
72853fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7286c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
72879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
7288f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->getLocation(),
7289f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->isArrow(), E->isFreeIvar());
7290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
72921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
729360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7294454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
729512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  // 'super' and types never change. Property never changes. Just
729612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  // retain the existing expression.
729712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (!E->isObjectReceiver())
72983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
72998ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian
7300e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // Transform the base expression.
730160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
7302e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (Base.isInvalid())
7303f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
7304c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7305e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // We don't need to transform the property; it will never change.
7306c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7307e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // If nothing changed, just retain the existing expression.
7308e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
7309e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      Base.get() == E->getBase())
73103fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
731212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (E->isExplicitProperty())
731312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
731412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                   E->getExplicitProperty(),
731512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                   E->getLocation());
731612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall
731712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
731812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                 E->getType(),
731912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                 E->getImplicitPropertyGetter(),
732012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                 E->getImplicitPropertySetter(),
732112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                 E->getLocation());
7322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
73241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
732560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7326454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
7327f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
732860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
7329f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
7330f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
7331c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7332f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
7333f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
7334f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
73353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7336c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
73379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
7338f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                         E->isArrow());
7339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
73411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
734260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7343454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
7344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
7345ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> SubExprs(SemaRef);
7346aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  SubExprs.reserve(E->getNumSubExprs());
7347aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
7348aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  SubExprs, &ArgumentChanged))
7349aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
73501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
7352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
73533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
73541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
7356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
7357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
7358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
73601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
736160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7362454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
7363c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  BlockDecl *oldBlock = E->getBlockDecl();
7364a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
7365c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0);
7366c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  BlockScopeInfo *blockScope = SemaRef.getCurBlock();
7367c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7368c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
7369c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  llvm::SmallVector<ParmVarDecl*, 4> params;
7370c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  llvm::SmallVector<QualType, 4> paramTypes;
7371a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
7372a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Parameter substitution.
7373c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
7374c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               oldBlock->param_begin(),
7375c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               oldBlock->param_size(),
7376c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               0, paramTypes, &params))
7377a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor    return true;
7378c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7379c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  const FunctionType *exprFunctionType = E->getFunctionType();
7380c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  QualType exprResultType = exprFunctionType->getResultType();
7381c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (!exprResultType.isNull()) {
7382c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    if (!exprResultType->isDependentType())
7383c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      blockScope->ReturnType = exprResultType;
7384c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    else if (exprResultType != getSema().Context.DependentTy)
7385c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      blockScope->ReturnType = getDerived().TransformType(exprResultType);
7386a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
7387a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
7388a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // If the return type has not been determined yet, leave it as a dependent
7389a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // type; it'll get set when we process the body.
7390c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (blockScope->ReturnType.isNull())
7391c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    blockScope->ReturnType = getSema().Context.DependentTy;
7392a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
7393a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // Don't allow returning a objc interface by value.
7394c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (blockScope->ReturnType->isObjCObjectType()) {
7395c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    getSema().Diag(E->getCaretLocation(),
7396a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor                   diag::err_object_cannot_be_passed_returned_by_value)
7397c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      << 0 << blockScope->ReturnType;
7398a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor    return ExprError();
7399a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  }
7400711c52bb20d0c69063b52a99826fb7d2835501f1John McCall
7401c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  QualType functionType = getDerived().RebuildFunctionProtoType(
7402c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                                        blockScope->ReturnType,
7403c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                                        paramTypes.data(),
7404c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                                        paramTypes.size(),
7405c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                                        oldBlock->isVariadic(),
7406c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                                        0, RQ_None,
7407c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               exprFunctionType->getExtInfo());
7408c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  blockScope->FunctionType = functionType;
7409711c52bb20d0c69063b52a99826fb7d2835501f1John McCall
7410711c52bb20d0c69063b52a99826fb7d2835501f1John McCall  // Set the parameters on the block decl.
7411c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (!params.empty())
7412c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    blockScope->TheDecl->setParams(params.data(), params.size());
7413a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
7414a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // If the return type wasn't explicitly set, it will have been marked as a
7415a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // dependent type (DependentTy); clear out the return type setting so
7416a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // we will deduce the return type when type-checking the block's body.
7417c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (blockScope->ReturnType == getSema().Context.DependentTy)
7418c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    blockScope->ReturnType = QualType();
7419a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
7420711c52bb20d0c69063b52a99826fb7d2835501f1John McCall  // Transform the body
7421c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  StmtResult body = getDerived().TransformStmt(E->getBody());
7422c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (body.isInvalid())
7423711c52bb20d0c69063b52a99826fb7d2835501f1John McCall    return ExprError();
7424711c52bb20d0c69063b52a99826fb7d2835501f1John McCall
7425c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#ifndef NDEBUG
7426c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  // In builds with assertions, make sure that we captured everything we
7427c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  // captured before.
7428c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7429c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (oldBlock->capturesCXXThis()) assert(blockScope->CapturesCXXThis);
7430c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7431c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  for (BlockDecl::capture_iterator i = oldBlock->capture_begin(),
7432c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall         e = oldBlock->capture_end(); i != e; ++i) {
74336b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    VarDecl *oldCapture = i->getVariable();
7434c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7435c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    // Ignore parameter packs.
7436c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    if (isa<ParmVarDecl>(oldCapture) &&
7437c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall        cast<ParmVarDecl>(oldCapture)->isParameterPack())
7438c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      continue;
7439c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7440c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    VarDecl *newCapture =
7441c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
7442c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               oldCapture));
74436b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    assert(blockScope->CaptureMap.count(newCapture));
7444c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  }
7445c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#endif
7446c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7447c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
7448c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                    /*Scope=*/0);
7449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
74511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
745260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7453454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
7454a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  ValueDecl *ND
7455a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
7456a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                       E->getDecl()));
7457a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!ND)
7458f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
74592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
7460a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!getDerived().AlwaysRebuild() &&
7461a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      ND == E->getDecl()) {
7462a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // Mark it referenced in the new context regardless.
7463a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // FIXME: this is a bit instantiation-specific.
7464a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
7465a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
74663fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7467a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
7468a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
74692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation());
747040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  return getDerived().RebuildDeclRefExpr(NestedNameSpecifierLoc(),
74712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, 0);
7472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
74731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
7475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
7476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
7477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
74781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
747985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
748085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
74812865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildPointerType(PointeeType, Star,
7482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
7483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
74851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
748685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
748785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
74882865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Star,
7489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
7490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
74921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
74931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
749485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
749585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
749685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
74972865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
749885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
7499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
75011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
75021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
750385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
750485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
750585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
75062865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
750785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
7508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
75111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
7512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
7513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
7514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
7515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
7516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
7517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
7518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
7519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
7520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
7521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
75221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
75241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
75251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
75261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
7527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
7528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
7529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
7530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
7531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
7532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
7533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
7534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
75351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75369996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  IntegerLiteral ArraySize(SemaRef.Context, *Size, SizeType,
75379996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                           /*FIXME*/BracketsRange.getBegin());
75381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
7539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
75401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
7541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
75421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
75441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
75451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
7546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
7547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
754885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
754985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
75501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
755185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
7552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
75551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
75561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
7557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
755885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
755985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
75601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
756185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
7562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
75631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
75651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
75661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
7567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
75689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SizeExpr,
7569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
7570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
75711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
75729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
7573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
7574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
75771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
75781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
7579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
75809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Expr *SizeExpr,
7581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
7582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
75831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
75849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
7585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
7586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
7590e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                               unsigned NumElements,
7591e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                               VectorType::VectorKind VecKind) {
7592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
7593e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson  return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
7594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
75951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
7598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
7599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
7600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
7601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
7602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
76039996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
76049996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                             AttributeLoc);
76059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
7606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
76071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
76091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
76101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
76119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                           Expr *SizeExpr,
7612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
76139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
7614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
76151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
76181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
7619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
76201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
7621fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                          unsigned Quals,
7622c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                                  RefQualifierKind RefQualifier,
7623fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                            const FunctionType::ExtInfo &Info) {
76241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
7625c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                   Quals, RefQualifier,
7626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
7627fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   getDerived().getBaseEntity(),
7628fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   Info);
7629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
76301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
7633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
7634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
7635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
7636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
7637ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
7638ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
7639ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
7640ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
764192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // FIXME: Doesn't account for ObjCInterfaceDecl!
7642ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
7643ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
7644ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
7645ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
7646ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
7647ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
7648ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
7649ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
7650ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
7651c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7652ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
7653ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
7654ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
7655ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
7656ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
7657ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
7658ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
7659ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
7660ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
7661ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
76622a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
76632a984cad5ac3fdceeff2bd99daa7b90979313475John McCall                                                       SourceLocation Loc) {
76642a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  return SemaRef.BuildTypeofExprType(E, Loc);
7665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
7669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
7670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
76732a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
76742a984cad5ac3fdceeff2bd99daa7b90979313475John McCall                                                     SourceLocation Loc) {
76752a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  return SemaRef.BuildDecltypeType(E, Loc);
7676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
7680833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
7681833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
768267714230a191bc3c01f33378f34f34ef377991a6Douglas Gregor                                     TemplateArgumentListInfo &TemplateArgs) {
7683d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
7684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
76851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7686dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
76871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
7688fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
7689d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
7690d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
7691fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
7692d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
7693d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
7694d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
7695d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
76961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
7697fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
7698fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            const IdentifierInfo &Name,
7699fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            SourceLocation NameLoc,
770043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                            QualType ObjectType,
770143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                            NamedDecl *FirstQualifierInScope) {
7702fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  UnqualifiedId TemplateName;
7703fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName.setIdentifier(&Name, NameLoc);
7704d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
7705d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
7706fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                       /*FIXME:*/SourceLocation(),
7707d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
7708fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                       TemplateName,
7709b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                       ParsedType::make(ObjectType),
7710d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
7711d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
771243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return Template.get();
7713d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
77141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
7716ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
7717fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
7718ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
7719fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            SourceLocation NameLoc,
7720ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
7721ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
7722fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  // FIXME: Bogus location information.
7723fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
7724fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
7725d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
7726d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
7727fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                       /*FIXME:*/SourceLocation(),
7728d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
7729d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
7730b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                       ParsedType::make(ObjectType),
7731d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
7732d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
7733d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
7734ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
7735c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7736ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
773760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
7739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
77409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *OrigCallee,
77419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *First,
77429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *Second) {
77439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Callee = OrigCallee->IgnoreParenCasts();
77449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
77451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
7747f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
77489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
77499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType())
77509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinArraySubscriptExpr(First,
77519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Callee->getLocStart(),
77529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Second, OpLoc);
77531a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
77541a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
77559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc);
77569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  } else if (Second == 0 || isPostIncDec) {
77579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType()) {
7758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
7759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
77602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      UnaryOperatorKind Opc
7761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
77621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
7764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
7765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
77669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
77679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType()) {
7768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
7769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
77702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
777160d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Result
77729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
7773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
7774f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
77751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
7777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
7778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
77791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
7781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
77826e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
77831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
7785ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
7786ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
7787ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
7788ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
77896e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
7790ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
77919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl());
7792ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
77931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
77959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Args[2] = { First, Second };
77969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  unsigned NumArgs = 1 + (Second != 0);
77971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
7799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
78002de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    UnaryOperatorKind Opc
7801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
78029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
7803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
78041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7805f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
78069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(),
7807ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
78089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      First,
78099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Second);
7810f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
7811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
78122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
781360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Result
7814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
7815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
7816f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
78171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
7819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
78201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
782126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
782260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
78239ae2f076ca5ab1feb3ba95629099ec2319833701John McCallTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
782426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
782526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
7826f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                                       CXXScopeSpec &SS,
782726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
782826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
7829fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
7830a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
78319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType BaseType = Base->getType();
78329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
783326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
7834c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      (isArrow && BaseType->getAs<PointerType>() &&
7835bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
7836bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
783726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
78389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
783926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
7840fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
7841a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
784226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
784326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
78442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
7845a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
78462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
78472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                 SemaRef.Context.getCanonicalType(DestroyedType->getType())));
78482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
78492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  NameInfo.setNamedTypeInfo(DestroyedType);
78502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
785126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
78522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
78539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getSema().BuildMemberReferenceExpr(Base, BaseType,
785426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
785526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
78562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            NameInfo,
785726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
785826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
785926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
7860577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
7861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7862577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
7863