TreeTransform.h revision b71d821d64af88749fc9860fd43a5164d8d819c8
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(),
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
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
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
381dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
382dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
384a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
385c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
386c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
388c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// \brief Transform the given nested-name-specifier with source-location
389c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// information.
390c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  ///
391c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// By default, transforms all of the types and declarations within the
392c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
393c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  /// alternate behavior.
394c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  NestedNameSpecifierLoc TransformNestedNameSpecifierLoc(
395c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                    NestedNameSpecifierLoc NNS,
396c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                          QualType ObjectType = QualType(),
397c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
398c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
39981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
40081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
40181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
40281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
40381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
40481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
4052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo
40643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
4071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
4091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
410d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
412d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
4133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
41443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                     QualType ObjectType = QualType(),
41543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                     NamedDecl *FirstQualifierInScope = 0);
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
417fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \brief Transform the given template name.
418fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
419fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param SS The nested-name-specifier that qualifies the template
420fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// name. This nested-name-specifier must already have been transformed.
421fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
422fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param Name The template name to transform.
423fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
424fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param NameLoc The source location of the template name.
425fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
426fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param ObjectType If we're translating a template name within a member
427fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// access expression, this is the type of the object whose member template
428fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// is being referenced.
429fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
430fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// \param FirstQualifierInScope If the first part of a nested-name-specifier
431fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// also refers to a name within the current (lexical) scope, this is the
432fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// declaration it refers to.
433fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  ///
434fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// By default, transforms the template name by transforming the declarations
435fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// and nested-name-specifiers that occur within the template name.
436fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
437fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName TransformTemplateName(CXXScopeSpec &SS,
438fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                     TemplateName Name,
439fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                     SourceLocation NameLoc,
440fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                     QualType ObjectType = QualType(),
441fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                     NamedDecl *FirstQualifierInScope = 0);
442fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
447670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
448670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
449833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
450833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
451833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
452833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
453833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
454fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// \brief Transform the given set of template arguments.
455fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
456fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// By default, this operation transforms all of the template arguments
457fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// in the input set using \c TransformTemplateArgument(), and appends
458fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// the transformed arguments to the output list.
459fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
4607ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// Note that this overload of \c TransformTemplateArguments() is merely
4617ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// a convenience function. Subclasses that wish to override this behavior
4627ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// should override the iterator-based member template version.
4637ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  ///
464fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// \param Inputs The set of template arguments to be transformed.
465fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
466fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// \param NumInputs The number of template arguments in \p Inputs.
467fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
468fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// \param Outputs The set of transformed template arguments output by this
469fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// routine.
470fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  ///
471fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  /// Returns true if an error occurred.
472fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
473fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                  unsigned NumInputs,
4747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                  TemplateArgumentListInfo &Outputs) {
4757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs);
4767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
4777f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
4787f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// \brief Transform the given set of template arguments.
4797f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  ///
4807f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// By default, this operation transforms all of the template arguments
4817f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// in the input set using \c TransformTemplateArgument(), and appends
4827f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// the transformed arguments to the output list.
4837f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  ///
4847ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// \param First An iterator to the first template argument.
4857ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  ///
4867ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// \param Last An iterator one step past the last template argument.
4877f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  ///
4887f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// \param Outputs The set of transformed template arguments output by this
4897f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// routine.
4907f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  ///
4917f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  /// Returns true if an error occurred.
4927ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  template<typename InputIterator>
4937ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  bool TransformTemplateArguments(InputIterator First,
4947ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                  InputIterator Last,
4957ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                  TemplateArgumentListInfo &Outputs);
4967f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
497833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
498833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
499833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
500833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
501a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// \brief Fakes up a TypeSourceInfo for a type.
502a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
503a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return SemaRef.Context.getTrivialTypeSourceInfo(T,
504833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
5061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
507a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
508a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
50943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
510a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
51243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType
51343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TransformTemplateSpecializationType(TypeLocBuilder &TLB,
51443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                      TemplateSpecializationTypeLoc TL,
51543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                      TemplateName Template);
51643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
51743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType
51843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
51943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                      DependentTemplateSpecializationTypeLoc TL,
520a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                               TemplateName Template);
521a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
522a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  QualType
523a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
524a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                      DependentTemplateSpecializationTypeLoc TL,
52543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                               NestedNameSpecifier *Prefix);
52643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
52794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  QualType
52894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
52994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                               DependentTemplateSpecializationTypeLoc TL,
53094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                         NestedNameSpecifierLoc QualifierLoc);
53194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
53221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms the parameters of a function type into the
53321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// given vectors.
53421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
53521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// The result vectors should be kept in sync; null entries in the
53621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// variables vector are acceptable.
53721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
53821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// Return true on error.
539a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor  bool TransformFunctionTypeParams(SourceLocation Loc,
540a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                   ParmVarDecl **Params, unsigned NumParams,
541a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                   const QualType *ParamTypes,
54221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<QualType> &PTypes,
543a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                   llvm::SmallVectorImpl<ParmVarDecl*> *PVars);
54421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
54521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms a single function-type parameter.  Return null
54621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// on error.
5476a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
5486a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                        llvm::Optional<unsigned> NumExpansions);
54921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
55043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
551833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
55260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
55360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
55660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Transform##Node(Node *S);
557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
55860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Transform##Node(Node *E);
5597381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
5604bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
5611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
56685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
57285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
57485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
57685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
57785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
57885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
58085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
58185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
58285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
58385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
58485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
5851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
59185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
59285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
5931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
6071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
61685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
61785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
62685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
62785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
6369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SizeExpr,
637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
6479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *SizeExpr,
648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
65682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
657e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                             VectorType::VectorKind VecKind);
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
6739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *SizeExpr,
674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
6811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
683fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    bool Variadic, unsigned Quals,
684c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                    RefQualifierKind RefQualifier,
685fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    const FunctionType::ExtInfo &Info);
6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
690ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// \brief Rebuild an unresolved typename type, given the decl that
691ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// the UnresolvedUsingTypenameDecl was transformed to.
692ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType RebuildUnresolvedUsingType(Decl *D);
693ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
694577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
695577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
697577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
699577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
700577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
7087da2431c23ef1ee8acb114e39692246e1801afc2John McCall
7091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7132a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
718577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
719577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
722577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7242a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72634b41d939a1328f484511c6002ba2456db879a29Richard Smith  /// \brief Build a new C++0x auto type.
72734b41d939a1328f484511c6002ba2456db879a29Richard Smith  ///
72834b41d939a1328f484511c6002ba2456db879a29Richard Smith  /// By default, builds a new AutoType with the given deduced type.
72934b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType RebuildAutoType(QualType Deduced) {
73034b41d939a1328f484511c6002ba2456db879a29Richard Smith    return SemaRef.Context.getAutoType(Deduced);
73134b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
73234b41d939a1328f484511c6002ba2456db879a29Richard Smith
733577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
735577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
736577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
739833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
740d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &Args);
7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
742075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  /// \brief Build a new parenthesized type.
743075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ///
744075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  /// By default, builds a new ParenType type from the inner type.
745075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  /// Subclasses may override this routine to provide different behavior.
746075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType RebuildParenType(QualType InnerType) {
747075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return SemaRef.Context.getParenType(InnerType);
748075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
749075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
751577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
752465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// By default, builds a new ElaboratedType type from the keyword,
753465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// the nested-name-specifier and the named type.
754465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// Subclasses may override this routine to provide different behavior.
75521e413fe6305a198564d436ac515497716c47844John McCall  QualType RebuildElaboratedType(SourceLocation KeywordLoc,
75621e413fe6305a198564d436ac515497716c47844John McCall                                 ElaboratedTypeKeyword Keyword,
7579e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                 NestedNameSpecifierLoc QualifierLoc,
7589e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                 QualType Named) {
7599e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    return SemaRef.Context.getElaboratedType(Keyword,
7609e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                         QualifierLoc.getNestedNameSpecifier(),
7619e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                             Named);
7621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
763577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
766e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// By default, builds a new DependentNameType type from the
767e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// nested-name-specifier and the given type. Subclasses may override
768e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// this routine to provide different behavior.
76933500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType RebuildDependentTemplateSpecializationType(
77094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          ElaboratedTypeKeyword Keyword,
77194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          NestedNameSpecifierLoc QualifierLoc,
77294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          const IdentifierInfo *Name,
77394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          SourceLocation NameLoc,
77494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                        const TemplateArgumentListInfo &Args) {
77594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // Rebuild the template name.
77694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // TODO: avoid TemplateName abstraction
777fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    CXXScopeSpec SS;
778fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    SS.Adopt(QualifierLoc);
77994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    TemplateName InstName
780fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 0);
78194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
78294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (InstName.isNull())
78394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      return QualType();
78494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
78594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // If it's still dependent, make a dependent specialization.
78694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (InstName.getAsDependentTemplateName())
78794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
78894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                          QualifierLoc.getNestedNameSpecifier(),
78994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                                    Name,
79094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                                    Args);
79194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
79294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // Otherwise, make an elaborated type wrapping a non-dependent
79394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // specialization.
79494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    QualType T =
79594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
79694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (T.isNull()) return QualType();
79794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
79894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == 0)
79994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      return T;
80094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
80194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    return SemaRef.Context.getElaboratedType(Keyword,
80294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                       QualifierLoc.getNestedNameSpecifier(),
80394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                             T);
80494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  }
80594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
807577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
808577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
809e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// (or elaborated type). Subclasses may override this routine to provide
810577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
811e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
812e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation KeywordLoc,
8132494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                    NestedNameSpecifierLoc QualifierLoc,
8142494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                    const IdentifierInfo *Id,
815e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation IdLoc) {
8164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    CXXScopeSpec SS;
8172494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    SS.Adopt(QualifierLoc);
818e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara
8192494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
8204033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      // If the name is still dependent, just build a new dependent name type.
8214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
8222494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor        return SemaRef.Context.getDependentNameType(Keyword,
8232494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                          QualifierLoc.getNestedNameSpecifier(),
8242494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                                    Id);
8254033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
8264033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
827465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (Keyword == ETK_None || Keyword == ETK_Typename)
8282494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor      return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
829e29425bd22fbb9200bbec7b743197b9c6dad3e40Douglas Gregor                                       *Id, IdLoc);
830465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
831465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
832465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
833e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    // We had a dependent elaborated-type-specifier that has been transformed
8344033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // into a non-dependent elaborated-type-specifier. Find the tag we're
8354033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // referring to.
836e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
8374033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
8384033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!DC)
8394033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
8404033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
8415613876991c80a684595fe8de1f039296a0657ffJohn McCall    if (SemaRef.RequireCompleteDeclContext(SS, DC))
8425613876991c80a684595fe8de1f039296a0657ffJohn McCall      return QualType();
8435613876991c80a684595fe8de1f039296a0657ffJohn McCall
8444033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    TagDecl *Tag = 0;
8454033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SemaRef.LookupQualifiedName(Result, DC);
8464033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    switch (Result.getResultKind()) {
8474033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFound:
8484033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFoundInCurrentInstantiation:
8494033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
850c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8514033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Found:
8524033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        Tag = Result.getAsSingle<TagDecl>();
8534033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
854c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8554033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundOverloaded:
8564033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundUnresolvedValue:
8574033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        llvm_unreachable("Tag lookup cannot find non-tags");
8584033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
859c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8604033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Ambiguous:
8614033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        // Let the LookupResult structure handle ambiguities.
8624033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
8634033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
8644033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
8654033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!Tag) {
866446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      // Check where the name exists but isn't a tag type and use that to emit
867446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      // better diagnostics.
868446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
869446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      SemaRef.LookupQualifiedName(Result, DC);
870446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      switch (Result.getResultKind()) {
871446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky        case LookupResult::Found:
872446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky        case LookupResult::FoundOverloaded:
873446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky        case LookupResult::FoundUnresolvedValue: {
874446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky	  NamedDecl *SomeDecl = Result.getRepresentativeDecl();
875446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          unsigned Kind = 0;
876446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
877446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 2;
878446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
879446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
880446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          break;
881446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky	}
882446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky        default:
883446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          // FIXME: Would be nice to highlight just the source range.
884446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
885446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky            << Kind << Id << DC;
886446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky          break;
887446e4029c75b651475e9055dc9dd18fbc7b6dabeNick Lewycky      }
8884033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
8894033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
890465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
891e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) {
892e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
8934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
8944033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
8954033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
8964033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
8974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // Build the elaborated-type-specifier type.
8984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    QualType T = SemaRef.Context.getTypeDeclType(Tag);
8992494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    return SemaRef.Context.getElaboratedType(Keyword,
9002494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                         QualifierLoc.getNestedNameSpecifier(),
9012494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                             T);
902dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9042fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  /// \brief Build a new pack expansion type.
9052fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  ///
9062fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  /// By default, builds a new PackExpansionType type from the given pattern.
9072fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9082fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  QualType RebuildPackExpansionType(QualType Pattern,
9092fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor                                    SourceRange PatternRange,
910cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                    SourceLocation EllipsisLoc,
911cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                    llvm::Optional<unsigned> NumExpansions) {
912cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
913cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                        NumExpansions);
9142fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  }
9152fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
916dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
917dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
918dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
919dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
920dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
921dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
922dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
923dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
924a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
925c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
926c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
927dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
928dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
929dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
930dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
931dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
932dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
933dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
934dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
935dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
936dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
937dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
938dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
93914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  /// namespace alias named in the next step in the nested-name-specifier.
94014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  ///
94114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  /// By default, performs semantic analysis when building the new
94214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
94314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  /// different behavior.
94414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
94514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                  SourceRange Range,
94614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                  NamespaceAliasDecl *Alias);
94714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
94814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
949dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
950dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
951dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
952dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
953dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
954dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
955dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
956dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
957edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  QualType T);
958d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
959d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
960d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
961d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
962d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
963d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
964d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
965fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName RebuildTemplateName(CXXScopeSpec &SS,
966d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
967d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
968d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
969d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
970d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
971d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
972d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
973d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
974d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
975d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
976fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName RebuildTemplateName(CXXScopeSpec &SS,
977fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                   const IdentifierInfo &Name,
978fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                   SourceLocation NameLoc,
97943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                   QualType ObjectType,
98043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                   NamedDecl *FirstQualifierInScope);
9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
982ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
983ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
984ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
985ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
986ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
987ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
988ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
989fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName RebuildTemplateName(CXXScopeSpec &SS,
990ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
991fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                   SourceLocation NameLoc,
992ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
9931aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
9941aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// \brief Build a new template name given a template template parameter pack
9951aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// and the
9961aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  ///
9971aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
9981aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
9991aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// template name. Subclasses may override this routine to provide different
10001aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  /// behavior.
10011aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
10021aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                   const TemplateArgument &ArgPack) {
10031aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
10041aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
10051aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
100743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
100843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
100943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
101060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
101143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
101243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
101343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
10149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
101543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
101643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
101743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
101843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
101943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
102043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
102143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
102260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
10239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *LHS,
102443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
10259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *RHS,
102643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
10279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
102843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
102943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
103143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
103243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
103343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
103443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
103560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
10369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().ActOnCaseStmtBody(S, Body);
10379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return S;
103843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
104043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
104143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
104243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
104343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
104460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
104543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
10469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      Stmt *SubStmt) {
10479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
104843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
104943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
105143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
105243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
105343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
105443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
105557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
105657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                              SourceLocation ColonLoc, Stmt *SubStmt) {
105757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
105843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
106043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
106143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
106243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
106343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
106460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
106557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                           VarDecl *CondVar, Stmt *Then,
106657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                           SourceLocation ElseLoc, Stmt *Else) {
106744aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis    return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
106843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
107043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
107143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
107243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
107343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
107460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
107557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                    Expr *Cond, VarDecl *CondVar) {
10769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
1077d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                            CondVar);
107843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
108043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
108143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
108243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
108343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
108460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
108557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                   Stmt *Switch, Stmt *Body) {
10869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
108743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
108843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
108943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
109043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
109143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
109243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
109357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond,
109457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                              VarDecl *CondVar, Stmt *Body) {
10959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
109643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
109843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
109943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
110043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
110143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
110260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1103ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                           SourceLocation WhileLoc, SourceLocation LParenLoc,
1104ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                           Expr *Cond, SourceLocation RParenLoc) {
11059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
11069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 Cond, RParenLoc);
110743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
110843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
110943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
111043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
111143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
111243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1113ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1114ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                            Stmt *Init, Sema::FullExprArg Cond,
1115ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                            VarDecl *CondVar, Sema::FullExprArg Inc,
1116ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                            SourceLocation RParenLoc, Stmt *Body) {
11179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1118ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                                  CondVar, Inc, RParenLoc, Body);
111943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
112143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
112243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
112343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
112443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1125ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1126ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                             LabelDecl *Label) {
112757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
112843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
112943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
113043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
113143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
113243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
113343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
113460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1135ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                                     SourceLocation StarLoc,
1136ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                                     Expr *Target) {
11379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
113843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
11391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
114043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
114143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
114243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
114343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1144ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
11459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnReturnStmt(ReturnLoc, Result);
114643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
114843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
114943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
115043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
115143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
115260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
11531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
115443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
1155406c38e8c1f105acfd438f94dfbc17af817aa4a5Richard Smith    Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls, NumDecls);
1156406c38e8c1f105acfd438f94dfbc17af817aa4a5Richard Smith    return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
115743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1159703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
1160703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
1161703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
1162703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
116360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildAsmStmt(SourceLocation AsmLoc,
1164703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
1165703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
1166703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
1167703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
1168ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
1169703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
1170703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
11719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Expr *AsmString,
1172703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
1173703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
1174703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
1175c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1176703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
11779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Exprs, AsmString, Clobbers,
1178703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
1179703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
11804dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
11814dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @try statement.
11824dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
11834dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
11844dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
118560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
11869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *TryBody,
11878f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                        MultiStmtArg CatchStmts,
11889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *Finally) {
11899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts),
11909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Finally);
11914dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
11924dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
1193be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Rebuild an Objective-C exception declaration.
1194be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
1195be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new declaration.
1196be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
1197be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1198be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                    TypeSourceInfo *TInfo, QualType T) {
1199c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildObjCExceptionDecl(TInfo, T,
1200c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                            ExceptionDecl->getIdentifier(),
1201be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                            ExceptionDecl->getLocation());
1202be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
1203c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1204be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Build a new Objective-C @catch statement.
1205be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
1206be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
1207be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
120860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1209be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          SourceLocation RParenLoc,
1210be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          VarDecl *Var,
12119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Stmt *Body) {
1212be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
12139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Var, Body);
1214be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
1215c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
12164dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @finally statement.
12174dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
12184dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
12194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
122060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
12219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Stmt *Body) {
12229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
12234dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
1224c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
12258fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @throw statement.
1226d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  ///
1227d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
1228d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
122960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
12309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *Operand) {
12319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1232d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
1233c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
12348fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @synchronized statement.
12358fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  ///
12368fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
12378fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
123860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
12399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *Object,
12409ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Stmt *Body) {
12419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object,
12429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Body);
12438fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  }
1244c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor
1245c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// \brief Build a new Objective-C fast enumeration statement.
1246c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  ///
1247c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
1248c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
124960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1250f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          SourceLocation LParenLoc,
1251f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Stmt *Element,
1252f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Expr *Collection,
1253f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          SourceLocation RParenLoc,
1254f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Stmt *Body) {
1255c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
12569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Element,
12579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Collection,
1258c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                RParenLoc,
12599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Body);
1260c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  }
1261c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
126243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
126343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
126443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
126543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
126683cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1267a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
126843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
126983cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor                                SourceLocation Loc) {
127083cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor    return getSema().BuildExceptionDeclaration(0, Declarator, Name, Loc);
127143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
127243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
127343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
127443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
127543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
127643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
127760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1278f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                 VarDecl *ExceptionDecl,
1279f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                 Stmt *Handler) {
12809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
12819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Handler));
128243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
128443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
128543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
128643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
128743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
128860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
1289f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                               Stmt *TryBlock,
1290f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                               MultiStmtArg Handlers) {
12919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers));
129243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
12931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
129860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1299f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                        LookupResult &R,
1300f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                        bool RequiresADL) {
1301f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1302f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
1303f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1304f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1305f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
1306f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
1307f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
1308f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
130940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1310f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                ValueDecl *VD,
1311f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                const DeclarationNameInfo &NameInfo,
1312f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                TemplateArgumentListInfo *TemplateArgs) {
1313a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
131440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    SS.Adopt(QualifierLoc);
1315dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
1316dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
13172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
13182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
132560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
13279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1330a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
13311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1332a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1333a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
133460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1335f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            SourceLocation OperatorLoc,
1336f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            bool isArrow,
1337f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            CXXScopeSpec &SS,
1338f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            TypeSourceInfo *ScopeType,
1339f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            SourceLocation CCLoc,
1340f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                            SourceLocation TildeLoc,
1341a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
134760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
13482de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                        UnaryOperatorKind Opc,
13499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *SubExpr) {
13509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr);
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Build a new builtin offsetof expression.
13548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ///
13558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
13568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
135760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
13588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       TypeSourceInfo *Type,
1359f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                       Sema::OffsetOfComponent *Components,
13608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       unsigned NumComponents,
13618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       SourceLocation RParenLoc) {
13628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
13638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          NumComponents, RParenLoc);
13648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1365c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
13671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
137060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
13715ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
1373a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
13761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
13781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
138160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildSizeOfAlignOf(Expr *SubExpr, SourceLocation OpLoc,
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
138360d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
13849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      = getSema().CreateSizeOfAlignOfExpr(SubExpr, OpLoc, isSizeOf, R);
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1386f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
13871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
13921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
139560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
13979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *RHS,
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
13999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS,
14009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             LBracketLoc, RHS,
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
14051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
140860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
1410e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                   SourceLocation RParenLoc,
1411e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                   Expr *ExecConfig = 0) {
14129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc,
1413e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                   move(Args), RParenLoc, ExecConfig);
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
14171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
142060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
1421f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               bool isArrow,
142240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                               NestedNameSpecifierLoc QualifierLoc,
1423f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               const DeclarationNameInfo &MemberNameInfo,
1424f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               ValueDecl *Member,
1425f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               NamedDecl *FoundDecl,
1426d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
1427f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               NamedDecl *FirstQualifierInScope) {
1428d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
1429f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      // We have a reference to an unnamed field.  This is always the
1430f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      // base of an anonymous struct/union member access, i.e. the
1431f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      // field is always of record type.
143240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
1433f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      assert(Member->getType()->isRecordType() &&
1434f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall             "unnamed member not of record type?");
14351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
143640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      if (getSema().PerformObjectMemberConversion(Base,
143740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                                        QualifierLoc.getNestedNameSpecifier(),
14386bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                                  FoundDecl, Member))
1439f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
14408aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
1441f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
14421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
14439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        new (getSema().Context) MemberExpr(Base, isArrow,
14442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                           Member, MemberNameInfo,
1445f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                           cast<FieldDecl>(Member)->getType(),
1446f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                           VK, OK_Ordinary);
1447d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
1448d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
14491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
145083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
145140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    SS.Adopt(QualifierLoc);
145283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
14539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().DefaultFunctionArrayConversion(Base);
14549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    QualType BaseType = Base->getType();
1455aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
14566bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // FIXME: this involves duplicating earlier analysis in a lot of
14576bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // cases; we should avoid this when possible.
14582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
14596bb8017bb9e828d118e15e59d71c66bba323c364John McCall    R.addDecl(FoundDecl);
1460c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1461c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
14629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1463129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1464c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
14681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
147160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
14722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                         BinaryOperatorKind Opc,
14739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *LHS, Expr *RHS) {
14749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS);
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
14781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
148160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildConditionalOperator(Expr *Cond,
148256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                        SourceLocation QuestionLoc,
148356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                        Expr *LHS,
148456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                        SourceLocation ColonLoc,
148556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                        Expr *RHS) {
14869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
14879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        LHS, RHS);
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
14911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
149460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
14959d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
14979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *SubExpr) {
1498b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
14999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubExpr);
1500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
15031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
150660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
150742f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
15099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Init) {
151042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
15119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Init);
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access 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 RebuildExtVectorElementExpr(Expr *Base,
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1522aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1523129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
15242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
15259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1526129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1527129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
15282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                              NameInfo,
1529129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
15331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
153660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildInitList(SourceLocation LBraceLoc,
1537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1538e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1539e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
154060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
1541e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1542e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1543e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1544c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1545e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1546e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1547e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1548e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1549e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
15531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
155660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
15609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *Init) {
156160d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
15639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Init);
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1565f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
15721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
157660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildImplicitValueInitExpr(QualType T) {
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
15811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
158460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
15859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SubExpr, TypeSourceInfo *TInfo,
15862cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    SourceLocation RParenLoc) {
15872cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara    return getSema().BuildVAArgExpr(BuiltinLoc,
15889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    SubExpr, TInfo,
15892cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    RParenLoc);
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
15931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
159660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1599c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1600f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
16041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
160860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1609ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner                                  SourceLocation LabelLoc, LabelDecl *Label) {
161057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
16141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
161760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
16189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Stmt *SubStmt,
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
16209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
162760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
16289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *Cond, Expr *LHS, Expr *RHS,
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
16319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Cond, LHS, RHS,
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
164360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
16459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Callee,
16469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *First,
16479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Second);
16481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
165560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
16589d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
16619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
16659d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
16661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
16679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
16709d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
16729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    SubExpr, RParenLoc);
16731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
16759d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
16761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
16779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                        SubExpr,
1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
16791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
16819d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
16839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
16841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
16891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1690f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
169760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
16999d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
17029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Expr *SubExpr,
1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1704c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
17059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1706c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1707c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
171460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
17169d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
17199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *SubExpr,
1720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1721c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
17229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1723c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1724c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
173160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
17339d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
17369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SubExpr,
1737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1738c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
17399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1740c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1741c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
174860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
17509d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
17539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1755c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
17569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1757c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1758c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1765ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
1766ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          SourceLocation LParenLoc,
1767ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          Expr *Sub,
1768ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          SourceLocation RParenLoc) {
1769ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
1770f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                               MultiExprArg(&Sub, 1),
1771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
177860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
177957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
178057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        TypeSourceInfo *Operand,
1781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1782c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
178357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
1784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
178601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
1787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
179160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
179257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
17939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand,
1794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
17959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
179657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
17971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
179901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// \brief Build a new C++ __uuidof(type) expression.
180001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ///
180101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// By default, performs semantic analysis to build the new expression.
180201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// Subclasses may override this routine to provide different behavior.
180301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
180401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        SourceLocation TypeidLoc,
180501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        TypeSourceInfo *Operand,
180601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        SourceLocation RParenLoc) {
180701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
180801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                    RParenLoc);
180901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
181001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
181101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// \brief Build a new C++ __uuidof(expr) expression.
181201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ///
181301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// By default, performs semantic analysis to build the new expression.
181401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  /// Subclasses may override this routine to provide different behavior.
181501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
181601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        SourceLocation TypeidLoc,
181701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        Expr *Operand,
181801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                        SourceLocation RParenLoc) {
181901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
182001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                    RParenLoc);
182101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
182201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
1823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
18261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
182860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1829ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor                                QualType ThisType,
1830ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor                                bool isImplicit) {
1831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1832828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1833828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
184060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub) {
18419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXThrow(ThrowLoc, Sub);
1842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
184960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1850036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1851036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1852036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1859ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
1860ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation LParenLoc,
1861ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation RParenLoc) {
1862ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
18631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1864ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               RParenLoc);
1865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
18661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
187160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
18721bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               bool UseGlobal,
18731bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation PlacementLParen,
18741bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               MultiExprArg PlacementArgs,
18751bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation PlacementRParen,
18761bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceRange TypeIdParens,
18771bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               QualType AllocatedType,
18781bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               TypeSourceInfo *AllocatedTypeInfo,
18791bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               Expr *ArraySize,
18801bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation ConstructorLParen,
18811bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               MultiExprArg ConstructorArgs,
18821bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation ConstructorRParen) {
18831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
18874bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                 TypeIdParens,
18881bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                 AllocatedType,
18891bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                 AllocatedTypeInfo,
18909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 ArraySize,
1891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
18951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
190060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
19039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand) {
1904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
19059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Operand);
1906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
19071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
191260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
19133d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor                                   SourceLocation StartLoc,
19143d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor                                   TypeSourceInfo *T,
19153d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor                                   SourceLocation RParenLoc) {
19163d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor    return getSema().BuildUnaryTypeTrait(Trait, StartLoc, T, RParenLoc);
1917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
19196ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  /// \brief Build a new binary type trait expression.
19206ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  ///
19216ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  /// By default, performs semantic analysis to build the new expression.
19226ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  /// Subclasses may override this routine to provide different behavior.
19236ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  ExprResult RebuildBinaryTypeTrait(BinaryTypeTrait Trait,
19246ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                    SourceLocation StartLoc,
19256ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                    TypeSourceInfo *LhsT,
19266ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                    TypeSourceInfo *RhsT,
19276ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                    SourceLocation RParenLoc) {
19286ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc);
19296ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  }
19306ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
19311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// 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.
193600cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  ExprResult RebuildDependentScopeDeclRefExpr(
193700cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor                                          NestedNameSpecifierLoc QualifierLoc,
19382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                       const DeclarationNameInfo &NameInfo,
1939f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
194100cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor    SS.Adopt(QualifierLoc);
1942f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1943f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
19442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo,
1945f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1946f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
19472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo);
1948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
195460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1955f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1956f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1957d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1958f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
196560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXConstructExpr(QualType T,
19664411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
19698c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           MultiExprArg Args,
19708c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           bool RequiresZeroInit,
1971428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                             CXXConstructExpr::ConstructionKind ConstructKind,
1972428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                           SourceRange ParenRange) {
1973ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> ConvertedArgs(SemaRef);
1974c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
19754411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
1976f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
1977c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
19784411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
19798c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           move_arg(ConvertedArgs),
1980428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                           RequiresZeroInit, ConstructKind,
1981428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                           ParenRange);
1982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1988ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
1989ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation LParenLoc,
1990ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           MultiExprArg Args,
1991ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation RParenLoc) {
1992ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo,
1993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
2000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
2001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
2002ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2003ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               SourceLocation LParenLoc,
2004ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               MultiExprArg Args,
2005ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               SourceLocation RParenLoc) {
2006ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo,
2007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
2008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
2009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
2010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
20111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
2013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
2014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
2015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
201660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
20177c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                QualType BaseType,
20187c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                bool IsArrow,
20197c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                SourceLocation OperatorLoc,
20207c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                          NestedNameSpecifierLoc QualifierLoc,
2021129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
20222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                   const DeclarationNameInfo &MemberNameInfo,
2023129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
2024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
20257c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    SS.Adopt(QualifierLoc);
20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2028aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
2029129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
20302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            MemberNameInfo,
20312577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            TemplateArgs);
2032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2034129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
20353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
20363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
20373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
203860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE,
2039aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
2040129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
2041129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
20424c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                                           NestedNameSpecifierLoc QualifierLoc,
2043c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
2044129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
2045129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
20463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
20474c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    SS.Adopt(QualifierLoc);
20481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2050aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
2051c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
2052c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
20533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20552e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  /// \brief Build a new noexcept expression.
20562e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  ///
20572e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  /// By default, performs semantic analysis to build the new expression.
20582e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  /// Subclasses may override this routine to provide different behavior.
20592e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
20602e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl    return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
20612e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  }
20622e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
2063ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  /// \brief Build a new expression to compute the length of a parameter pack.
2064ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
2065ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                   SourceLocation PackLoc,
2066ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                   SourceLocation RParenLoc,
2067ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                   unsigned Length) {
2068ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2069ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                                OperatorLoc, Pack, PackLoc,
2070ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                                RParenLoc, Length);
2071ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  }
2072ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
2073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
2074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
2075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
2076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
207760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
207881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                         TypeSourceInfo *EncodeTypeInfo,
2079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
208081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
2081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
20821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
2083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
208492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C class message.
208560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
208692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
2087f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                          SourceLocation SelectorLoc,
208892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
2089c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
209092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
209192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
209292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
209392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     ReceiverTypeInfo->getType(),
209492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     /*SuperLoc=*/SourceLocation(),
2095f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                     Sel, Method, LBracLoc, SelectorLoc,
2096f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                     RBracLoc, move(Args));
209792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
209892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
209992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C instance message.
210060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCMessageExpr(Expr *Receiver,
210192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
2102f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                          SourceLocation SelectorLoc,
210392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
2104c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
210592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
210692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
21079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildInstanceMessage(Receiver,
21089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Receiver->getType(),
210992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        /*SuperLoc=*/SourceLocation(),
2110f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                        Sel, Method, LBracLoc, SelectorLoc,
2111f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                        RBracLoc, move(Args));
211292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
211392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
2114f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C ivar reference expression.
2115f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
2116f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
2117f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
211860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2119f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          SourceLocation IvarLoc,
2120f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          bool IsArrow, bool IsFreeIvar) {
2121f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    // FIXME: We lose track of the IsFreeIvar bit.
2122f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
21239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
2124f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
2125f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
212660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2127f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IvarLoc,
2128d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0,
2129ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
2130f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
2131f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
2132c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2133f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
2134f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
2135c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
21369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2137c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IvarLoc, IsArrow, SS,
2138f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
2139c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
2140f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
2141f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
2142e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor
2143e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// \brief Build a new Objective-C property reference expression.
2144e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  ///
2145e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
2146e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
214760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2148e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              ObjCPropertyDecl *Property,
2149e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              SourceLocation PropertyLoc) {
2150e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    CXXScopeSpec SS;
21519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
2152e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
2153e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                   Sema::LookupMemberName);
2154e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    bool IsArrow = false;
215560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2156e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         /*FIME:*/PropertyLoc,
2157d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
2158e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.isInvalid())
2159f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
2160c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2161e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.get())
2162e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return move(Result);
2163c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
21649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2165c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/PropertyLoc, IsArrow,
2166c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              SS,
2167e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*FirstQualifierInScope=*/0,
2168c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
2169e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*TemplateArgs=*/0);
2170e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  }
2171c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
217212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  /// \brief Build a new Objective-C property reference expression.
21739cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  ///
21749cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
217512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  /// Subclasses may override this routine to provide different behavior.
217612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
217712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                        ObjCMethodDecl *Getter,
217812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                        ObjCMethodDecl *Setter,
217912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                        SourceLocation PropertyLoc) {
218012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    // Since these expressions can only be value-dependent, we do not
218112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    // need to perform semantic analysis again.
218212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    return Owned(
218312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall      new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
218412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                  VK_LValue, OK_ObjCProperty,
218512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                  PropertyLoc, Base));
21869cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  }
21879cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor
2188f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C "isa" expression.
2189f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
2190f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
2191f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
219260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2193f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                      bool IsArrow) {
2194f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
21959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
2196f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
2197f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
219860d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
2199f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IsaLoc,
2200d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
2201f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
2202f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
2203c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2204f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
2205f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
2206c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
22079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2208c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IsaLoc, IsArrow, SS,
2209f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
2210c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
2211f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
2212f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
2213c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
2215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
2216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
2217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
221860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
2219f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                      MultiExprArg SubExprs,
2220f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                      SourceLocation RParenLoc) {
2221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
22221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
2223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
2224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
2225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
2226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
22271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
2229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
2231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
2232f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                          VK_LValue, BuiltinLoc);
2233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
22341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
2236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
2237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
2238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
2239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
22405291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor                                                   Builtin->getCallResultType(),
2241f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                            Expr::getValueKindForType(Builtin->getResultType()),
2242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
224360d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult OwnedCall(SemaRef.Owned(TheCall));
22441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
224660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
2247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
2248f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
22491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
22511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
2252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
225343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
22548491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// \brief Build a new template argument pack expansion.
22558491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  ///
22568491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// By default, performs semantic analysis to build a new pack expansion
22578491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// for a template argument. Subclasses may override this routine to provide
22588491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  /// different behavior.
22598491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
2260cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                           SourceLocation EllipsisLoc,
2261cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                       llvm::Optional<unsigned> NumExpansions) {
22628491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    switch (Pattern.getArgument().getKind()) {
22637a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor    case TemplateArgument::Expression: {
22647a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor      ExprResult Result
226567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor        = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
226667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                       EllipsisLoc, NumExpansions);
22677a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor      if (Result.isInvalid())
22687a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor        return TemplateArgumentLoc();
22697a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor
22707a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor      return TemplateArgumentLoc(Result.get(), Result.get());
22717a21fd45d4f04643cbfb5df96a01f84bc6d3dd14Douglas Gregor    }
2272dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
22738491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Template:
2274a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      return TemplateArgumentLoc(TemplateArgument(
2275a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                          Pattern.getArgument().getAsTemplate(),
22762be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor                                                  NumExpansions),
2277b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                 Pattern.getTemplateQualifierLoc(),
2278a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                 Pattern.getTemplateNameLoc(),
2279a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                 EllipsisLoc);
22808491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
22818491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Null:
22828491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Integral:
22838491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Declaration:
22848491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Pack:
2285a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    case TemplateArgument::TemplateExpansion:
22868491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      llvm_unreachable("Pack expansion pattern has no parameter packs");
22878491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
22888491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    case TemplateArgument::Type:
22898491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      if (TypeSourceInfo *Expansion
22908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor            = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
2291cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                           EllipsisLoc,
2292cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                           NumExpansions))
22938491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
22948491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                   Expansion);
22958491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      break;
22968491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    }
22978491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
22988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    return TemplateArgumentLoc();
22998491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  }
23008491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
2301dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  /// \brief Build a new expression pack expansion.
2302dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  ///
2303dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  /// By default, performs semantic analysis to build a new pack expansion
2304dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  /// for an expression. Subclasses may override this routine to provide
2305dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  /// different behavior.
230667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
230767fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                  llvm::Optional<unsigned> NumExpansions) {
230867fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor    return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
2309dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor  }
2310dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
231143fed0de4f5bc189e45562491f83d5193eb8dac0John McCallprivate:
2312c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  TypeLoc TransformTypeInObjectScope(TypeLoc TL,
2313c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                     QualType ObjectType,
2314c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                     NamedDecl *FirstQualifierInScope,
2315c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                     CXXScopeSpec &SS);
2316b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
2317b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
2318b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                             QualType ObjectType,
2319b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                             NamedDecl *FirstQualifierInScope,
2320b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                             CXXScopeSpec &SS);
2321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
2322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
232343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
232460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
232543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
232643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
23271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
232843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
232943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
23301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
233143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
233243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
233343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
233463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(Node)
233543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
23364bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
23371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
233843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
233943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
23407381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
234143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
23424bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
234343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
234460d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
234543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
2346f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
23471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take()));
234943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
23501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
23511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23523fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(S);
235343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
23541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2356670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
235760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
2359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
2360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
2362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
2363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
23647381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
2365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
2366454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
23674bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
23681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
23691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23703fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
2371657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
2372657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
2373657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
2374aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregorbool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
2375aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                            unsigned NumInputs,
2376aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                            bool IsCall,
2377aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                      llvm::SmallVectorImpl<Expr *> &Outputs,
2378aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                            bool *ArgChanged) {
2379aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  for (unsigned I = 0; I != NumInputs; ++I) {
2380aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    // If requested, drop call arguments that need to be dropped.
2381aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
2382aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      if (ArgChanged)
2383aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor        *ArgChanged = true;
2384aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2385aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      break;
2386aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    }
2387aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2388dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor    if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
2389dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      Expr *Pattern = Expansion->getPattern();
2390dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2391dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2392dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
2393dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
2394dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2395dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      // Determine whether the set of unexpanded parameter packs can and should
2396dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      // be expanded.
2397dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      bool Expand = true;
2398d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      bool RetainExpansion = false;
239967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor      llvm::Optional<unsigned> OrigNumExpansions
240067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor        = Expansion->getNumExpansions();
240167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor      llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
2402dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
2403dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor                                               Pattern->getSourceRange(),
2404dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor                                               Unexpanded.data(),
2405dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor                                               Unexpanded.size(),
2406d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               Expand, RetainExpansion,
2407d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               NumExpansions))
2408dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        return true;
2409dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2410dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      if (!Expand) {
2411dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        // The transform has determined that we should perform a simple
2412dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        // transformation on the pack expansion, producing another pack
2413dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        // expansion.
2414dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
2415dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        ExprResult OutPattern = getDerived().TransformExpr(Pattern);
2416dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (OutPattern.isInvalid())
2417dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          return true;
2418dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2419dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
242067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                                Expansion->getEllipsisLoc(),
242167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                                           NumExpansions);
2422dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (Out.isInvalid())
2423dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          return true;
2424dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2425dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (ArgChanged)
2426dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          *ArgChanged = true;
2427dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        Outputs.push_back(Out.get());
2428dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        continue;
2429dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      }
2430dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2431dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      // The transform has determined that we should perform an elementwise
2432dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      // expansion of the pattern. Do so.
2433cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      for (unsigned I = 0; I != *NumExpansions; ++I) {
2434dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
2435dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        ExprResult Out = getDerived().TransformExpr(Pattern);
2436dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (Out.isInvalid())
2437dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          return true;
2438dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
243977d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor        if (Out.get()->containsUnexpandedParameterPack()) {
244067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor          Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(),
244167fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                     OrigNumExpansions);
244277d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor          if (Out.isInvalid())
244377d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor            return true;
244477d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor        }
244577d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor
2446dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        if (ArgChanged)
2447dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor          *ArgChanged = true;
2448dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor        Outputs.push_back(Out.get());
2449dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      }
2450dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2451dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor      continue;
2452dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor    }
2453dcaa1ca0b475dfa887e1d061678a1e3501288510Douglas Gregor
2454aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    ExprResult Result = getDerived().TransformExpr(Inputs[I]);
2455aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    if (Result.isInvalid())
2456aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      return true;
2457aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2458aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    if (Result.get() != Inputs[I] && ArgChanged)
2459aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      *ArgChanged = true;
2460aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2461aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    Outputs.push_back(Result.get());
2462aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  }
2463aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2464aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  return false;
2465aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor}
2466aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
2467aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregortemplate<typename Derived>
2468dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
2469dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
2470a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
2471c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
2472c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
247343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  NestedNameSpecifier *Prefix = NNS->getPrefix();
24741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
247543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
2476dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
24771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
2478c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
2479c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
2480dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
2481dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
2482dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
24831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2484dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
2485dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
248643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    if (Prefix) {
248743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      // The object type and qualifier-in-scope really apply to the
248843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      // leftmost entity.
248943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      ObjectType = QualType();
249043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      FirstQualifierInScope = 0;
249143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    }
249243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
24931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
2494a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
2495a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
2496a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
2497dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
24981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2500a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
2501c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
2502c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
25031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2504dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
2506dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
25077c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
25087c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       NNS->getAsNamespace()));
25091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
2510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2511dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
2512dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
25131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
25161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
251714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NestedNameSpecifier::NamespaceAlias: {
251814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    NamespaceAliasDecl *Alias
251914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor      = cast_or_null<NamespaceAliasDecl>(
252014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
252114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                    NNS->getAsNamespaceAlias()));
252214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
252314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor        Prefix == NNS->getPrefix() &&
252414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor        Alias == NNS->getAsNamespaceAlias())
252514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor      return NNS;
252614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
252714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, Alias);
252814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  }
252914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
2530dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
2531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
2532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
2533dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
25341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2535dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
2536dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
2537fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2538b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    CXXScopeSpec SS;
2539b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    SS.MakeTrivial(SemaRef.Context, Prefix, Range);
2540b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
2541b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    TypeSourceInfo *TSInfo
2542b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(QualType(NNS->getAsType(), 0),
2543b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                 Range.getEnd());
2544b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    TSInfo = TransformTypeInObjectScope(TSInfo,
2545b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                        ObjectType,
2546b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                        FirstQualifierInScope,
2547b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                        SS);
2548b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    if (!TSInfo)
2549d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
25501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2551b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    QualType T = TSInfo->getType();
2552dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
2553dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2554dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
2555dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
25561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
25581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2559edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   T);
2560dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
2561dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
25621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2563dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
25641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
2565dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
2566dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
2567dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
2568c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc
2569c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorTreeTransform<Derived>::TransformNestedNameSpecifierLoc(
2570c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                    NestedNameSpecifierLoc NNS,
2571c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                     QualType ObjectType,
2572c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
2573c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  llvm::SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
2574c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
2575c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor       Qualifier = Qualifier.getPrefix())
2576c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    Qualifiers.push_back(Qualifier);
2577c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2578c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  CXXScopeSpec SS;
2579c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  while (!Qualifiers.empty()) {
2580c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
2581c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
2582c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2583c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    switch (QNNS->getKind()) {
2584c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::Identifier:
2585c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0,
2586c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              *QNNS->getAsIdentifier(),
2587c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              Q.getLocalBeginLoc(),
2588c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              Q.getLocalEndLoc(),
2589c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              ObjectType, false, SS,
2590c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              FirstQualifierInScope, false))
2591c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        return NestedNameSpecifierLoc();
2592c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2593c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      break;
2594c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2595c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::Namespace: {
2596c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      NamespaceDecl *NS
2597c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        = cast_or_null<NamespaceDecl>(
2598c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                    getDerived().TransformDecl(
2599c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                          Q.getLocalBeginLoc(),
2600c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                       QNNS->getAsNamespace()));
2601c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
2602c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      break;
2603c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    }
2604c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2605c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::NamespaceAlias: {
2606c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      NamespaceAliasDecl *Alias
2607c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        = cast_or_null<NamespaceAliasDecl>(
2608c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                      getDerived().TransformDecl(Q.getLocalBeginLoc(),
2609c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                 QNNS->getAsNamespaceAlias()));
2610c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
2611c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                Q.getLocalEndLoc());
2612c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      break;
2613c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    }
2614c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2615c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::Global:
2616c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      // There is no meaningful transformation that one could perform on the
2617c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      // global scope.
2618c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
2619c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      break;
2620c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2621c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::TypeSpecWithTemplate:
2622c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    case NestedNameSpecifier::TypeSpec: {
2623c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
2624c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                              FirstQualifierInScope, SS);
2625c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2626c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      if (!TL)
2627c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        return NestedNameSpecifierLoc();
2628c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2629c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
2630c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor          (SemaRef.getLangOptions().CPlusPlus0x &&
2631c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor           TL.getType()->isEnumeralType())) {
2632c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        assert(!TL.getType().hasLocalQualifiers() &&
2633c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor               "Can't get cv-qualifiers here");
2634c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
2635c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                  Q.getLocalEndLoc());
2636c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        break;
2637c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      }
2638c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2639c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
2640c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor        << TL.getType() << SS.getRange();
2641c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      return NestedNameSpecifierLoc();
2642c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    }
26437c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    }
2644c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
26457c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    // The qualifier-in-scope and object type only apply to the leftmost entity.
2646c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    FirstQualifierInScope = 0;
26477c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    ObjectType = QualType();
2648c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  }
2649c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2650c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // Don't rebuild the nested-name-specifier if we don't have to.
2651c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
2652c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      !getDerived().AlwaysRebuild())
2653c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    return NNS;
2654c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2655c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // If we can re-use the source-location data from the original
2656c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // nested-name-specifier, do so.
2657c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (SS.location_size() == NNS.getDataLength() &&
2658c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
2659c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
2660c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2661c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // Allocate new nested-name-specifier location information.
2662c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  return SS.getWithLocInContext(SemaRef.Context);
2663c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor}
2664c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
2665c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename Derived>
26662577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameInfo
26672577743c5650c646fb705df01403707e94f2df04Abramo BagnaraTreeTransform<Derived>
266843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
26692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name = NameInfo.getName();
267081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
26712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return DeclarationNameInfo();
267281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
267381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
267481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
267581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
267681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
267781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
267881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
26793e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
268081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
26812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NameInfo;
26821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
268381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
268481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
268581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
26862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    TypeSourceInfo *NewTInfo;
26872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CanQualType NewCanTy;
26882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
268943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      NewTInfo = getDerived().TransformType(OldTInfo);
269043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      if (!NewTInfo)
269143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall        return DeclarationNameInfo();
269243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
26932577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
26942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    else {
26952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewTInfo = 0;
26962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
269743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      QualType NewT = getDerived().TransformType(Name.getCXXNameType());
26982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      if (NewT.isNull())
26992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        return DeclarationNameInfo();
27002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewCanTy = SemaRef.Context.getCanonicalType(NewT);
27012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName NewName
27042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
27052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                           NewCanTy);
27062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NewNameInfo(NameInfo);
27072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setName(NewName);
27082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setNamedTypeInfo(NewTInfo);
27092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NewNameInfo;
271081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
27111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(0 && "Unknown name kind.");
27142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return DeclarationNameInfo();
271581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
271681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
271781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
27181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
27193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
272043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                              QualType ObjectType,
272143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                              NamedDecl *FirstQualifierInScope) {
2722fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  // FIXME: This routine needs to go away.
27237c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  SourceLocation Loc = getDerived().getBaseLocation();
27247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor
2725d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
27261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2727d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
272843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                  /*FIXME*/ SourceRange(Loc),
272943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                  ObjectType,
273043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                  FirstQualifierInScope);
2731d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
2732d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2734d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
27351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
27367c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2737d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
2738d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
27391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2740d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
2741d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
2742d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
2743d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
27441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2745fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      CXXScopeSpec SS;
2746fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      SS.MakeTrivial(SemaRef.Context, NNS, Loc);
2747fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
2748d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
2749d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
27501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2751f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
275243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    llvm_unreachable("overloaded template name survived to here");
2753d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
27541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2755d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
275643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    NestedNameSpecifier *NNS = DTN->getQualifier();
275743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    if (NNS) {
275843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      NNS = getDerived().TransformNestedNameSpecifier(NNS,
275943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                  /*FIXME:*/SourceRange(Loc),
276043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      ObjectType,
276143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      FirstQualifierInScope);
276243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      if (!NNS) return TemplateName();
276343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
276443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      // These apply to the scope specifier, not the template.
276543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      ObjectType = QualType();
276643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      FirstQualifierInScope = 0;
276743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    }
27681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2769d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2770dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
2771dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
2772d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
27731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2774fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    // FIXME: Bad source-location information all around.
2775fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    CXXScopeSpec SS;
2776fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    SS.MakeTrivial(SemaRef.Context, NNS, getDerived().getBaseLocation());
27771efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor    if (DTN->isIdentifier()) {
2778fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return getDerived().RebuildTemplateName(SS,
2779fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              *DTN->getIdentifier(),
2780fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              getDerived().getBaseLocation(),
278143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                              ObjectType,
278243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                              FirstQualifierInScope);
27831efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor    }
2784c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2785fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return getDerived().RebuildTemplateName(SS, DTN->getOperator(),
2786fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            getDerived().getBaseLocation(),
2787ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
2788d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
27891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2790d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
27911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
27927c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2793d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
2794d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
27951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2796d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2797d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
2798d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
27991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2800d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
2801d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
28021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28031aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  if (SubstTemplateTemplateParmPackStorage *SubstPack
28041aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                 = Name.getAsSubstTemplateTemplateParmPack()) {
28051aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    TemplateTemplateParmDecl *TransParam
28061aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      = cast_or_null<TemplateTemplateParmDecl>(
28071aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor               getDerived().TransformDecl(Loc, SubstPack->getParameterPack()));
28081aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    if (!TransParam)
28091aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      return TemplateName();
28101aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
28111aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
28121aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor        TransParam == SubstPack->getParameterPack())
28131aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor      return Name;
28141aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
28151aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    return getDerived().RebuildTemplateName(TransParam,
28161aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor                                            SubstPack->getArgumentPack());
28171aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor  }
28181aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor
2819f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
282043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  llvm_unreachable("overloaded function decl survived to here");
2821f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
2822d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
2823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
2824d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
2825fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTemplateName
2826fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
2827fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              TemplateName Name,
2828fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              SourceLocation NameLoc,
2829fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              QualType ObjectType,
2830fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              NamedDecl *FirstQualifierInScope) {
2831fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
2832fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    TemplateDecl *Template = QTN->getTemplateDecl();
2833fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    assert(Template && "qualified template name must refer to a template");
2834fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2835fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    TemplateDecl *TransTemplate
2836fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
2837fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                                              Template));
2838fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!TransTemplate)
2839fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return TemplateName();
2840fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2841fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2842fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        SS.getScopeRep() == QTN->getQualifier() &&
2843fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        TransTemplate == Template)
2844fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return Name;
2845fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2846fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
2847fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            TransTemplate);
2848fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  }
2849fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2850fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
2851fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (SS.getScopeRep()) {
2852fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      // These apply to the scope specifier, not the template.
2853fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      ObjectType = QualType();
2854fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      FirstQualifierInScope = 0;
2855fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    }
2856fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2857fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2858fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        SS.getScopeRep() == DTN->getQualifier() &&
2859fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        ObjectType.isNull())
2860fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return Name;
2861fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2862fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (DTN->isIdentifier()) {
2863fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return getDerived().RebuildTemplateName(SS,
2864fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              *DTN->getIdentifier(),
2865fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              NameLoc,
2866fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              ObjectType,
2867fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                              FirstQualifierInScope);
2868fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    }
2869fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2870fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
2871fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            ObjectType);
2872fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  }
2873fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2874fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
2875fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    TemplateDecl *TransTemplate
2876fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
2877fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                                              Template));
2878fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!TransTemplate)
2879fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return TemplateName();
2880fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2881fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2882fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        TransTemplate == Template)
2883fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return Name;
2884fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2885fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return TemplateName(TransTemplate);
2886fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  }
2887fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2888fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  if (SubstTemplateTemplateParmPackStorage *SubstPack
2889fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = Name.getAsSubstTemplateTemplateParmPack()) {
2890fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    TemplateTemplateParmDecl *TransParam
2891fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    = cast_or_null<TemplateTemplateParmDecl>(
2892fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor            getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
2893fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!TransParam)
2894fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return TemplateName();
2895fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2896fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2897fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor        TransParam == SubstPack->getParameterPack())
2898fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      return Name;
2899fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2900fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor    return getDerived().RebuildTemplateName(TransParam,
2901fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            SubstPack->getArgumentPack());
2902fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  }
2903fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2904fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  // These should be getting filtered out before they reach the AST.
2905fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  llvm_unreachable("overloaded function decl survived to here");
2906fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  return TemplateName();
2907fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor}
2908fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor
2909fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregortemplate<typename Derived>
2910833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
2911833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
2912833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2913833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
2914670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
2915670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
29169f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
2917833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2918833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2919833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
2920833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
2921a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2922c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2923833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2924833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2925788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
2926b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor  case TemplateArgument::TemplateExpansion: {
2927b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    NestedNameSpecifierLocBuilder Builder;
2928b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    TemplateName Template = Arg.getAsTemplate();
2929b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
2930b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
2931b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
2932b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
2933b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor
2934b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (Arg.getKind() == TemplateArgument::Template)
2935b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      Output = TemplateArgumentLoc(Arg,
2936b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                   Builder.getWithLocInContext(SemaRef.Context),
2937b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                   Loc);
2938b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    else
2939b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      Output = TemplateArgumentLoc(Arg,
2940b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                   Builder.getWithLocInContext(SemaRef.Context),
2941b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor                                   Loc, Loc);
2942b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor
2943a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    break;
2944b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor  }
2945a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
2946833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
2947833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
2951670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
2952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
2953828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2957833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
2960833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
2961833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2962833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
2963833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
2964833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
2965833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
2966833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
2967833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
29681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2969670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
2970a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2971833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
2972a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2973833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2974833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
2975833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
2976833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2977833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2978833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2979670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
29801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2981670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
2982833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
2983972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
2984972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2985972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
2986788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
29877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2988833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
2989833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2990828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
2991828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
2992828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
2993f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                                   Sema::Unevaluated);
299460d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult E = getDerived().TransformExpr(SourceExpr);
29959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      SourceExpr = (E.isInvalid() ? 0 : E.take());
2996828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
2997828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2998828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2999833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
3000670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
30011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3002788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
3003b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3004b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (QualifierLoc) {
3005b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3006b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      if (!QualifierLoc)
3007b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor        return true;
3008b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    }
3009b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor
3010c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
3011788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
3012788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
3013788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
3014788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
3015c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3016b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3017788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
3018788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
3019788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
3020a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
3021a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
3022a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    llvm_unreachable("Caller should expand pack expansions");
3023a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
3024670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
3025670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
30261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
3027f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                                 Sema::Unevaluated);
30281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3029833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
3030833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3031833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
303260d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult E
3033833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
3034833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
30359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take());
3036833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
3037670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
30381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3039670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
3040670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
3041670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
30421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
3043670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
3044670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
30451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3046833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
3047833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
3048833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3049828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
3050828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
3051828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
3052828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
3053833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
3054833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3055828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
3056670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
3057910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor
3058910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgument *TransformedArgsPtr
3059910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor      = new (getSema().Context) TemplateArgument[TransformedArgs.size()];
3060910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    std::copy(TransformedArgs.begin(), TransformedArgs.end(),
3061910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor              TransformedArgsPtr);
3062910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(TransformedArgsPtr,
3063910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                  TransformedArgs.size()),
3064910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 Input.getLocInfo());
3065833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
3066670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
3067670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
30681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3069670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
3070833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
3071670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
3072670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
30737ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor/// \brief Iterator adaptor that invents template argument location information
30747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor/// for each of the template arguments in its underlying iterator.
30757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregortemplate<typename Derived, typename InputIterator>
30767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorclass TemplateArgumentLocInventIterator {
30777ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  TreeTransform<Derived> &Self;
30787ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  InputIterator Iter;
30797ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
30807ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorpublic:
30817ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef TemplateArgumentLoc value_type;
30827ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef TemplateArgumentLoc reference;
30837ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef typename std::iterator_traits<InputIterator>::difference_type
30847ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    difference_type;
30857ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef std::input_iterator_tag iterator_category;
30867ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
30877ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  class pointer {
30887ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLoc Arg;
3089fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor
30907ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  public:
30917ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
30927ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
30937ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    const TemplateArgumentLoc *operator->() const { return &Arg; }
30947ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  };
30957ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
30967ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  TemplateArgumentLocInventIterator() { }
30977ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
30987ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
30997ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                             InputIterator Iter)
31007ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    : Self(Self), Iter(Iter) { }
31017ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
31027ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  TemplateArgumentLocInventIterator &operator++() {
31037ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    ++Iter;
31047ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return *this;
3105fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  }
3106fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor
31077ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  TemplateArgumentLocInventIterator operator++(int) {
31087ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocInventIterator Old(*this);
31097ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    ++(*this);
31107ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return Old;
31117ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
31127ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
31137ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  reference operator*() const {
31147ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLoc Result;
31157ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    Self.InventTemplateArgumentLoc(*Iter, Result);
31167ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return Result;
31177ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
31187ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
31197ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  pointer operator->() const { return pointer(**this); }
31207ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
31217ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  friend bool operator==(const TemplateArgumentLocInventIterator &X,
31227ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                         const TemplateArgumentLocInventIterator &Y) {
31237ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return X.Iter == Y.Iter;
31247ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
3125fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor
31267ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  friend bool operator!=(const TemplateArgumentLocInventIterator &X,
31277ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                         const TemplateArgumentLocInventIterator &Y) {
31287ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    return X.Iter != Y.Iter;
31297ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  }
31307ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor};
31317ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
31327f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregortemplate<typename Derived>
31337ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregortemplate<typename InputIterator>
31347ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregorbool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
31357ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                                        InputIterator Last,
31367f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor                                            TemplateArgumentListInfo &Outputs) {
31377ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  for (; First != Last; ++First) {
31387f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor    TemplateArgumentLoc Out;
31397ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLoc In = *First;
31408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
31418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    if (In.getArgument().getKind() == TemplateArgument::Pack) {
31428491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // Unpack argument packs, which we translate them into separate
31438491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // arguments.
31447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      // FIXME: We could do much better if we could guarantee that the
31457ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      // TemplateArgumentLocInfo for the pack expansion would be usable for
31467ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      // all of the template arguments in the argument pack.
31477ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      typedef TemplateArgumentLocInventIterator<Derived,
31487ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                                TemplateArgument::pack_iterator>
31497ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor        PackLocIterator;
31507ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      if (TransformTemplateArguments(PackLocIterator(*this,
31517ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                                 In.getArgument().pack_begin()),
31527ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                     PackLocIterator(*this,
31537ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                                   In.getArgument().pack_end()),
31547ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                     Outputs))
31557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor        return true;
31568491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
31578491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      continue;
31588491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    }
31598491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
31608491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    if (In.getArgument().isPackExpansion()) {
31618491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // We have a pack expansion, for which we will be substituting into
31628491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // the pattern.
31638491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      SourceLocation Ellipsis;
3164cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      llvm::Optional<unsigned> OrigNumExpansions;
31658491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      TemplateArgumentLoc Pattern
3166cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        = In.getPackExpansionPattern(Ellipsis, OrigNumExpansions,
3167cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                     getSema().Context);
31688491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
31698491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
31708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
31718491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
31728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
31738491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // Determine whether the set of unexpanded parameter packs can and should
31748491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // be expanded.
31758491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      bool Expand = true;
3176d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      bool RetainExpansion = false;
3177cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
31788491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      if (getDerived().TryExpandParameterPacks(Ellipsis,
31798491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                               Pattern.getSourceRange(),
31808491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                               Unexpanded.data(),
31818491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                               Unexpanded.size(),
3182d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               Expand,
3183d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               RetainExpansion,
3184d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               NumExpansions))
31858491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        return true;
31868491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
31878491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      if (!Expand) {
31888491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        // The transform has determined that we should perform a simple
31898491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        // transformation on the pack expansion, producing another pack
31908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        // expansion.
31918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        TemplateArgumentLoc OutPattern;
31928491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
31938491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        if (getDerived().TransformTemplateArgument(Pattern, OutPattern))
31948491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor          return true;
31958491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
3196cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3197cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                NumExpansions);
31988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        if (Out.getArgument().isNull())
31998491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor          return true;
32008491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
32018491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        Outputs.addArgument(Out);
32028491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        continue;
32038491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      }
32048491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
32058491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // The transform has determined that we should perform an elementwise
32068491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      // expansion of the pattern. Do so.
3207cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      for (unsigned I = 0; I != *NumExpansions; ++I) {
32088491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
32098491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
32108491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        if (getDerived().TransformTemplateArgument(Pattern, Out))
32118491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor          return true;
32128491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
321377d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor        if (Out.getArgument().containsUnexpandedParameterPack()) {
3214cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor          Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3215cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                  OrigNumExpansions);
321677d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor          if (Out.getArgument().isNull())
321777d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor            return true;
321877d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor        }
321977d6bb9e223496aa5288294f34e7225d1f65dddcDouglas Gregor
32208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor        Outputs.addArgument(Out);
32218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      }
32228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
32233cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      // If we're supposed to retain a pack expansion, do so by temporarily
32243cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      // forgetting the partially-substituted parameter pack.
32253cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      if (RetainExpansion) {
32263cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        ForgetPartiallySubstitutedPackRAII Forget(getDerived());
32273cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor
32283cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        if (getDerived().TransformTemplateArgument(Pattern, Out))
32293cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor          return true;
32303cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor
3231cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3232cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                OrigNumExpansions);
32333cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        if (Out.getArgument().isNull())
32343cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor          return true;
32353cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor
32363cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        Outputs.addArgument(Out);
32373cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      }
3238d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
32398491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      continue;
32408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    }
32418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
32428491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    // The simple case:
32438491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    if (getDerived().TransformTemplateArgument(In, Out))
32447f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor      return true;
32457f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
32467f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor    Outputs.addArgument(Out);
32477f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  }
32487f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
32497f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor  return false;
32507f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
32517f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor}
32527f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor
3253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
3254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
3255577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
3256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
325843fed0de4f5bc189e45562491f83d5193eb8dac0John McCallQualType TreeTransform<Derived>::TransformType(QualType T) {
3259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
3260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3262a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
3263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
3264c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor  TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3265c21c7e9c2cded68f91be15be6847c9649242dc17Douglas Gregor                                                getDerived().getBaseLocation());
3266c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
326743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(DI);
32681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3269a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
3270a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
32711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3272a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
3273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
327643fed0de4f5bc189e45562491f83d5193eb8dac0John McCallTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
3277a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
3278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
32791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
32811bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
3282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
3283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
32841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
328543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType Result = getDerived().TransformType(TLB, TL);
3286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3289a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
329443fed0de4f5bc189e45562491f83d5193eb8dac0John McCallTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
3295a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
3296a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
3297a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
3298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
329943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
3300a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
3301a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
33039f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
3304a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
3305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3307a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
3308a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
3309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
3310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
3311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
33121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
3314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
331543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                               QualifiedTypeLoc T) {
3316a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
3317a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
331843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
3319a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
3323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
3324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
3325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
3326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
33271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33282865474261a608c7873b87ba4af110d17907896dJohn McCall  if (!Quals.empty()) {
33292865474261a608c7873b87ba4af110d17907896dJohn McCall    Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
33302865474261a608c7873b87ba4af110d17907896dJohn McCall    TLB.push<QualifiedTypeLoc>(Result);
33312865474261a608c7873b87ba4af110d17907896dJohn McCall    // No location information to preserve.
33322865474261a608c7873b87ba4af110d17907896dJohn McCall  }
3333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
3336a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
333743fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate<typename Derived>
3338b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTypeLoc
3339b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
334043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   QualType ObjectType,
334143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   NamedDecl *UnqualLookup,
3342b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                   CXXScopeSpec &SS) {
3343b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  QualType T = TL.getType();
334443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  if (getDerived().AlreadyTransformed(T))
3345b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    return TL;
3346b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
334743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TypeLocBuilder TLB;
334843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType Result;
3349b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
335043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  if (isa<TemplateSpecializationType>(T)) {
3351b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    TemplateSpecializationTypeLoc SpecTL
3352b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      = cast<TemplateSpecializationTypeLoc>(TL);
3353b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
335443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    TemplateName Template =
3355b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      getDerived().TransformTemplateName(SS,
3356b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         SpecTL.getTypePtr()->getTemplateName(),
3357b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         SpecTL.getTemplateNameLoc(),
335843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                         ObjectType, UnqualLookup);
3359b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    if (Template.isNull())
3360b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      return TypeLoc();
3361b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
3362b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3363b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                              Template);
336443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  } else if (isa<DependentTemplateSpecializationType>(T)) {
3365b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    DependentTemplateSpecializationTypeLoc SpecTL
3366b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      = cast<DependentTemplateSpecializationTypeLoc>(TL);
3367a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
3368b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    TemplateName Template
3369b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      = getDerived().RebuildTemplateName(SS,
3370b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         *SpecTL.getTypePtr()->getIdentifier(),
3371b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         SpecTL.getNameLoc(),
3372b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                         ObjectType, UnqualLookup);
3373a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    if (Template.isNull())
3374b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      return TypeLoc();
3375b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
3376b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3377b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                                       SpecTL,
3378a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                                     Template);
337943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  } else {
338043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    // Nothing special needs to be done for these.
3381b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    Result = getDerived().TransformType(TLB, TL);
338243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  }
3383b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
3384b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  if (Result.isNull())
3385b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    return TypeLoc();
3386b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor
3387b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc();
338843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall}
338943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
3390c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregortemplate<typename Derived>
3391b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTypeSourceInfo *
3392b71d821d64af88749fc9860fd43a5164d8d819c8Douglas GregorTreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3393c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                   QualType ObjectType,
3394c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                   NamedDecl *UnqualLookup,
3395c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                   CXXScopeSpec &SS) {
3396c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // FIXME: Painfully copy-paste from the above!
3397c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3398b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  QualType T = TSInfo->getType();
3399c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (getDerived().AlreadyTransformed(T))
3400b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    return TSInfo;
3401c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3402c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  TypeLocBuilder TLB;
3403c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  QualType Result;
3404c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3405b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  TypeLoc TL = TSInfo->getTypeLoc();
3406c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (isa<TemplateSpecializationType>(T)) {
3407c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    TemplateSpecializationTypeLoc SpecTL
3408c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      = cast<TemplateSpecializationTypeLoc>(TL);
3409c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3410b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    TemplateName Template
3411b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    = getDerived().TransformTemplateName(SS,
3412fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                         SpecTL.getTypePtr()->getTemplateName(),
3413fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                         SpecTL.getTemplateNameLoc(),
3414c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                         ObjectType, UnqualLookup);
3415c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    if (Template.isNull())
3416b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      return 0;
3417c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3418c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3419c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor                                                              Template);
3420c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  } else if (isa<DependentTemplateSpecializationType>(T)) {
3421c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    DependentTemplateSpecializationTypeLoc SpecTL
3422c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor      = cast<DependentTemplateSpecializationTypeLoc>(TL);
3423c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3424a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    TemplateName Template
3425fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor      = getDerived().RebuildTemplateName(SS,
34267c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                         *SpecTL.getTypePtr()->getIdentifier(),
3427fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                         SpecTL.getNameLoc(),
34287c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                         ObjectType, UnqualLookup);
3429a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    if (Template.isNull())
3430b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor      return 0;
3431a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
3432c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3433a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                                       SpecTL,
3434b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                                       Template);
3435c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  } else {
3436c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    // Nothing special needs to be done for these.
3437c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor    Result = getDerived().TransformType(TLB, TL);
3438c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  }
3439c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3440c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  if (Result.isNull())
3441b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor    return 0;
3442c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3443b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3444c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor}
3445c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
3446a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
3447a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
3448a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
3449a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
3450a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
3451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
3452a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3453a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
3454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
345543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      BuiltinTypeLoc T) {
3456ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
3457ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
3458ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
3459ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
3460ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
3461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
34631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3464a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
346543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      ComplexTypeLoc T) {
3466a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
3467a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
3468a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
34691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3470a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
3471a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
347243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      PointerTypeLoc TL) {
3473c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType PointeeType
3474c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
347592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType.isNull())
347692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return QualType();
347792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
347892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  QualType Result = TL.getType();
3479c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (PointeeType->getAs<ObjCObjectType>()) {
348092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // A dependent pointer type 'T *' has is being transformed such
348192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // that an Objective-C class type is being replaced for 'T'. The
348292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // resulting pointer type is an ObjCObjectPointerType, not a
348392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // PointerType.
3484c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
3485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3486c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
3487c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    NewT.setStarLoc(TL.getStarLoc());
348892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Result;
348992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
349043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
349192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (getDerived().AlwaysRebuild() ||
349292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      PointeeType != TL.getPointeeLoc().getType()) {
349392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
349492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Result.isNull())
349592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return QualType();
349692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
3497c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
349892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
349992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
3500c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Result;
3501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
35031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
35041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
3505a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
350643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                  BlockPointerTypeLoc TL) {
3507db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  QualType PointeeType
3508c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
3509c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (PointeeType.isNull())
3510c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return QualType();
3511c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3512c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType Result = TL.getType();
3513c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (getDerived().AlwaysRebuild() ||
3514c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      PointeeType != TL.getPointeeLoc().getType()) {
3515c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildBlockPointerType(PointeeType,
3516db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor                                                  TL.getSigilLoc());
3517db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor    if (Result.isNull())
3518db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor      return QualType();
3519db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  }
3520db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor
352139968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
3522db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
3523db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  return Result;
3524a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
352785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
352885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
352985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
353085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
353185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
353285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
353343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                               ReferenceTypeLoc TL) {
353485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
353585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
353685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
353785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
353885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
353985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
354085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
354185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
354285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
354385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
354485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
354585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
354685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
354785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
354885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
354985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
355085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
355185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
355285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
355385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
355485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
355585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
355685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
355785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
355885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
355985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
356085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
356185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
3562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
3563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3564a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
356543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                 LValueReferenceTypeLoc TL) {
356643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return TransformReferenceType(TLB, TL);
3567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
3570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
357243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                 RValueReferenceTypeLoc TL) {
357343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return TransformReferenceType(TLB, TL);
3574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
35751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
35771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
3578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
357943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   MemberPointerTypeLoc TL) {
3580f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const MemberPointerType *T = TL.getTypePtr();
3581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
3583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
3584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
3587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
3588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
3589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
3590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
3595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
359685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
359785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
3598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
3603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
3604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
36081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
36091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
3610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
361143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   ConstantArrayTypeLoc TL) {
3612f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const ConstantArrayType *T = TL.getTypePtr();
3613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
36161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3618a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3619a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
3620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
3621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
3622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
362385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
362485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
3625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3627a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3628c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
3630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
3631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
36321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
3634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
3635f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
3637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
3639a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
36421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
3645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
364643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                              IncompleteArrayTypeLoc TL) {
3647f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const IncompleteArrayType *T = TL.getTypePtr();
3648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
36511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
3655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
3656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
365785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
365885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
3659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3662c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
3664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
3665a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
3666a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
3667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
36701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
367443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   VariableArrayTypeLoc TL) {
3675f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const VariableArrayType *T = TL.getTypePtr();
3676a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
36791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3680670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
3681f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3682670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
368360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SizeResult
3684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
3685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
3686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
36871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Size = SizeResult.take();
3689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
3693a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
3694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
3695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
36969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Size,
3697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
369885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
3699a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3702c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
3704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
3705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
3706a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
371443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                             DependentSizedArrayTypeLoc TL) {
3715f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DependentSizedArrayType *T = TL.getTypePtr();
3716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
3717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3718577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
37191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3720670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
3721f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
37221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37233b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  // Prefer the expression from the TypeLoc;  the other may have been uniqued.
37243b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Expr *origSize = TL.getSizeExpr();
37253b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (!origSize) origSize = T->getSizeExpr();
37263b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall
37273b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  ExprResult sizeResult
37283b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall    = getDerived().TransformExpr(origSize);
37293b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  if (sizeResult.isInvalid())
3730577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
37311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37323b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  Expr *size = sizeResult.get();
3733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3734a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3736a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
37373b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall      size != origSize) {
3738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
3739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
37403b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall                                                         size,
3741a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
374285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
3743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3745577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
37461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
3748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
3749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
3750a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
3751a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
37523b6575108a5b6d8b92ac3a9a7794bf6c3a210907John McCall  NewTL.setSizeExpr(size);
3753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3755577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
37561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3758577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
3759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
376043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                      DependentSizedExtVectorTypeLoc TL) {
3761f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DependentSizedExtVectorType *T = TL.getTypePtr();
3762a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
3764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
3765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
37671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3768670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
3769f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
3770670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
377160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
3772577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
3773577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
37741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3776a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3777eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
3778eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
3779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
37809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                             Size.take(),
3781577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
3782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
3787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
3788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
3789a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
3790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
3791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
3792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
3793a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
3794a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3796a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3797577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
37981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3800a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
380143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                     VectorTypeLoc TL) {
3802f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const VectorType *T = TL.getTypePtr();
3803577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
3804577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3805577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3807a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3808a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
381082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
3811e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                            T->getVectorKind());
3812a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3814a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3815c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
3817a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
38181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3819a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3820577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
38211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3823a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
382443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                        ExtVectorTypeLoc TL) {
3825f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const VectorType *T = TL.getTypePtr();
3826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
3827577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
3828577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
38291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3830a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3831a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
3833a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
3834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
3835a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
3836a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3837a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3838a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3839c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3840a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
3841a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
38421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3843a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3845577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
38461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
384721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
38486a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas GregorTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm,
38496a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                       llvm::Optional<unsigned> NumExpansions) {
385021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
38516a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  TypeSourceInfo *NewDI = 0;
38526a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
38536a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
38546a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    // If we're substituting into a pack expansion type and we know the
38556a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    TypeLoc OldTL = OldDI->getTypeLoc();
38566a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    PackExpansionTypeLoc OldExpansionTL = cast<PackExpansionTypeLoc>(OldTL);
38576a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
38586a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    TypeLocBuilder TLB;
38596a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    TypeLoc NewTL = OldDI->getTypeLoc();
38606a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    TLB.reserve(NewTL.getFullDataSize());
38616a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
38626a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    QualType Result = getDerived().TransformType(TLB,
38636a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                               OldExpansionTL.getPatternLoc());
38646a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    if (Result.isNull())
38656a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      return 0;
38666a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
38676a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    Result = RebuildPackExpansionType(Result,
38686a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                OldExpansionTL.getPatternLoc().getSourceRange(),
38696a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                      OldExpansionTL.getEllipsisLoc(),
38706a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                      NumExpansions);
38716a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    if (Result.isNull())
38726a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      return 0;
38736a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor
38746a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    PackExpansionTypeLoc NewExpansionTL
38756a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      = TLB.push<PackExpansionTypeLoc>(Result);
38766a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
38776a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
38786a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor  } else
38796a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor    NewDI = getDerived().TransformType(OldDI);
388021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
388121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
388221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
388321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
388421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
388521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
388621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
388721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
388821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
388921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
389021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
389121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
389221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
389316573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                               OldParm->getStorageClassAsWritten(),
389421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
389521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
389621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
389721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
389821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
3899a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor  TransformFunctionTypeParams(SourceLocation Loc,
3900a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                              ParmVarDecl **Params, unsigned NumParams,
3901a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                              const QualType *ParamTypes,
3902a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                              llvm::SmallVectorImpl<QualType> &OutParamTypes,
3903a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                              llvm::SmallVectorImpl<ParmVarDecl*> *PVars) {
3904a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor  for (unsigned i = 0; i != NumParams; ++i) {
3905a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    if (ParmVarDecl *OldParm = Params[i]) {
39066a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor      llvm::Optional<unsigned> NumExpansions;
3907406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      ParmVarDecl *NewParm = 0;
3908603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      if (OldParm->isParameterPack()) {
3909603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // We have a function parameter pack that may need to be expanded.
3910603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3911603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3912603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // Find the parameter packs that could be expanded.
3913c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
3914c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(TL);
3915c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        TypeLoc Pattern = ExpansionTL.getPatternLoc();
3916c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
3917406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor        assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
3918406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor
3919603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // Determine whether we should expand the parameter packs.
3920603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        bool ShouldExpand = false;
3921d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor        bool RetainExpansion = false;
39226a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor        llvm::Optional<unsigned> OrigNumExpansions
39236a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor          = ExpansionTL.getTypePtr()->getNumExpansions();
39246a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor        NumExpansions = OrigNumExpansions;
3925c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor        if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
3926c8a16fbb78c0e0ae2d2ebdb00bd6761d9d6714d2Douglas Gregor                                                 Pattern.getSourceRange(),
3927603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                                 Unexpanded.data(),
3928603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                                 Unexpanded.size(),
3929d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                                 ShouldExpand,
3930d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                                 RetainExpansion,
3931d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                                 NumExpansions)) {
3932603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          return true;
3933603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        }
3934603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3935603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        if (ShouldExpand) {
3936603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          // Expand the function parameter pack into multiple, separate
3937603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          // parameters.
393812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor          getDerived().ExpandingFunctionParameterPack(OldParm);
3939cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor          for (unsigned I = 0; I != *NumExpansions; ++I) {
3940603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor            Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3941603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor            ParmVarDecl *NewParm
39426a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor              = getDerived().TransformFunctionTypeParam(OldParm,
39436a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                                        OrigNumExpansions);
3944603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor            if (!NewParm)
3945603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor              return true;
3946603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3947a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor            OutParamTypes.push_back(NewParm->getType());
3948a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor            if (PVars)
3949a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor              PVars->push_back(NewParm);
3950603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          }
3951d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
3952d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor          // If we're supposed to retain a pack expansion, do so by temporarily
3953d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor          // forgetting the partially-substituted parameter pack.
3954d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor          if (RetainExpansion) {
3955d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3956d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            ParmVarDecl *NewParm
39576a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor              = getDerived().TransformFunctionTypeParam(OldParm,
39586a24bfda084f06a0b252b7befe8cbb17fce7f94eDouglas Gregor                                                        OrigNumExpansions);
3959d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            if (!NewParm)
3960d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor              return true;
3961d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
3962d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            OutParamTypes.push_back(NewParm->getType());
3963d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor            if (PVars)
3964d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor              PVars->push_back(NewParm);
3965d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor          }
3966d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
3967603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          // We're done with the pack expansion.
3968603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          continue;
3969603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        }
3970603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3971603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // We'll substitute the parameter now without expanding the pack
3972603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // expansion.
3973406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor        Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3974406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor        NewParm = getDerived().TransformFunctionTypeParam(OldParm,
3975406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor                                                          NumExpansions);
3976406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      } else {
3977406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor        NewParm = getDerived().TransformFunctionTypeParam(OldParm,
3978406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor                                                  llvm::Optional<unsigned>());
3979603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      }
3980406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor
398121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
398221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
3983603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
3984a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor      OutParamTypes.push_back(NewParm->getType());
3985a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor      if (PVars)
3986a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor        PVars->push_back(NewParm);
3987603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      continue;
3988603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    }
3989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
3991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
3992a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    QualType OldType = ParamTypes[i];
3993603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    bool IsPackExpansion = false;
3994cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    llvm::Optional<unsigned> NumExpansions;
3995406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    QualType NewType;
3996603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    if (const PackExpansionType *Expansion
3997603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                       = dyn_cast<PackExpansionType>(OldType)) {
3998603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      // We have a function parameter pack that may need to be expanded.
3999603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      QualType Pattern = Expansion->getPattern();
4000603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      llvm::SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4001603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4002603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
4003603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      // Determine whether we should expand the parameter packs.
4004603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      bool ShouldExpand = false;
4005d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      bool RetainExpansion = false;
4006a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor      if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4007603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                               Unexpanded.data(),
4008603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor                                               Unexpanded.size(),
4009d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               ShouldExpand,
4010d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               RetainExpansion,
4011d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                               NumExpansions)) {
401221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
4013603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      }
4014603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
4015603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      if (ShouldExpand) {
4016603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // Expand the function parameter pack into multiple, separate
4017603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // parameters.
4018cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        for (unsigned I = 0; I != *NumExpansions; ++I) {
4019603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4020603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          QualType NewType = getDerived().TransformType(Pattern);
4021603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor          if (NewType.isNull())
4022603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor            return true;
4023603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
4024a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor          OutParamTypes.push_back(NewType);
4025a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor          if (PVars)
4026a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor            PVars->push_back(0);
4027603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        }
4028603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
4029603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        // We're done with the pack expansion.
4030603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor        continue;
4031603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      }
4032603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
40333cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      // If we're supposed to retain a pack expansion, do so by temporarily
40343cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      // forgetting the partially-substituted parameter pack.
40353cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      if (RetainExpansion) {
40363cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        ForgetPartiallySubstitutedPackRAII Forget(getDerived());
40373cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        QualType NewType = getDerived().TransformType(Pattern);
40383cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        if (NewType.isNull())
40393cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor          return true;
40403cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor
40413cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        OutParamTypes.push_back(NewType);
40423cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor        if (PVars)
40433cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor          PVars->push_back(0);
40443cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66fDouglas Gregor      }
4045d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
4046603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      // We'll substitute the parameter now without expanding the pack
4047603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      // expansion.
4048603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      OldType = Expansion->getPattern();
4049603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      IsPackExpansion = true;
4050406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4051406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      NewType = getDerived().TransformType(OldType);
4052406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor    } else {
4053406f98f6a5a7bde5707085af8d66204e7e76af45Douglas Gregor      NewType = getDerived().TransformType(OldType);
4054a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
4055603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
4056603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    if (NewType.isNull())
4057603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor      return true;
40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4059603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor    if (IsPackExpansion)
4060cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      NewType = getSema().Context.getPackExpansionType(NewType,
4061cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                       NumExpansions);
4062603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor
4063a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    OutParamTypes.push_back(NewType);
4064a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    if (PVars)
4065a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor      PVars->push_back(0);
4066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
40671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
406821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
4069603cfb4da2f7ba08a1c3452c2fbf70585b8e7621Douglas Gregor  }
407021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
407121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
407221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
407321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
407443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   FunctionProtoTypeLoc TL) {
40757e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // Transform the parameters and return type.
40767e010a04fef171049291d8cb3047f118566da090Douglas Gregor  //
40777e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // We instantiate in source order, with the return type first followed by
40787e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // the parameters, because users tend to expect this (even if they shouldn't
40797e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // rely on it!).
40807e010a04fef171049291d8cb3047f118566da090Douglas Gregor  //
4081dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  // When the function has a trailing return type, we instantiate the
4082dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  // parameters before the return type,  since the return type can then refer
4083dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  // to the parameters themselves (via decltype, sizeof, etc.).
4084dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  //
408521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
408621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
4087f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const FunctionProtoType *T = TL.getTypePtr();
40887e010a04fef171049291d8cb3047f118566da090Douglas Gregor
4089dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  QualType ResultType;
4090dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
4091dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  if (TL.getTrailingReturn()) {
4092a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(),
4093a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 TL.getParmArray(),
4094a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 TL.getNumArgs(),
4095a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                             TL.getTypePtr()->arg_type_begin(),
4096a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 ParamTypes, &ParamDecls))
4097dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      return QualType();
4098dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
4099dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
4100dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    if (ResultType.isNull())
4101dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      return QualType();
4102dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  }
4103dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  else {
4104dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
4105dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    if (ResultType.isNull())
4106dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      return QualType();
4107dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
4108a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor    if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(),
4109a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 TL.getParmArray(),
4110a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 TL.getNumArgs(),
4111a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                             TL.getTypePtr()->arg_type_begin(),
4112a009b59fc2c550a229b9146aabda8e33fe3a7771Douglas Gregor                                                 ParamTypes, &ParamDecls))
4113dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      return QualType();
4114dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  }
4115dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor
4116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
4119bd5f9f708aa31920d3bd73aa10fcb5de424c657aDouglas Gregor      T->getNumArgs() != ParamTypes.size() ||
4120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
4121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
4122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
4123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
4124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
4125fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getTypeQuals(),
4126c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                                   T->getRefQualifier(),
4127fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getExtInfo());
4128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4130a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
4133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
4134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
4135dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  NewTL.setTrailingReturn(TL.getTrailingReturn());
4136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
4137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
4138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
41411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4142577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
4144a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
414543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                 FunctionNoProtoTypeLoc TL) {
4146f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const FunctionNoProtoType *T = TL.getTypePtr();
4147a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
4148a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
4149a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
4150a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4152a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4153a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
4154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
4155a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4156a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
4157a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
4158a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
4159dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor  NewTL.setTrailingReturn(false);
4160a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4161a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4164ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
4165ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
416643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                 UnresolvedUsingTypeLoc TL) {
4167f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const UnresolvedUsingType *T = TL.getTypePtr();
41687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
4169ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
4170ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
4171ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
4172ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
4173ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
4174ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
4175ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
4176ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
4177ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
4178ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
4179ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
4180ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
4181ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
4182ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
4183ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
4184ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
4185ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
4186ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
4187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
418943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      TypedefTypeLoc TL) {
4190f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const TypedefType *T = TL.getTypePtr();
4191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
41927c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
41937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
4194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
4195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
41961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
4200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
4201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4203a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
4204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
4206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
42071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4209577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4212a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
421343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      TypeOfExprTypeLoc TL) {
4214670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
4215f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
42161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
421760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
4218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
4219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
4220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4221a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4222a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4223cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
42242a984cad5ac3fdceeff2bd99daa7b90979313475John McCall    Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
4225a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4226a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4228a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
42291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4230a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
4231cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
4232cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
4233cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
4234a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4235a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4239a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
424043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                     TypeOfTypeLoc TL) {
4241cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
4242cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
4243cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
4244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
42451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4246a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4247cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
4248cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
4249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4250a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4251a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
42521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4253a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
4254cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
4255cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
4256cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
4257cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
4258a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4259a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4263a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
426443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                       DecltypeTypeLoc TL) {
4265f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DecltypeType *T = TL.getTypePtr();
4266a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4267670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
4268f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
42691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
427060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
4271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
4272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
42731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
42772a984cad5ac3fdceeff2bd99daa7b90979313475John McCall    Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
4278a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
4282a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4283a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
4284a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
42851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
429034b41d939a1328f484511c6002ba2456db879a29Richard SmithQualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
429134b41d939a1328f484511c6002ba2456db879a29Richard Smith                                                   AutoTypeLoc TL) {
429234b41d939a1328f484511c6002ba2456db879a29Richard Smith  const AutoType *T = TL.getTypePtr();
429334b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType OldDeduced = T->getDeducedType();
429434b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType NewDeduced;
429534b41d939a1328f484511c6002ba2456db879a29Richard Smith  if (!OldDeduced.isNull()) {
429634b41d939a1328f484511c6002ba2456db879a29Richard Smith    NewDeduced = getDerived().TransformType(OldDeduced);
429734b41d939a1328f484511c6002ba2456db879a29Richard Smith    if (NewDeduced.isNull())
429834b41d939a1328f484511c6002ba2456db879a29Richard Smith      return QualType();
429934b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
430034b41d939a1328f484511c6002ba2456db879a29Richard Smith
430134b41d939a1328f484511c6002ba2456db879a29Richard Smith  QualType Result = TL.getType();
430234b41d939a1328f484511c6002ba2456db879a29Richard Smith  if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced) {
430334b41d939a1328f484511c6002ba2456db879a29Richard Smith    Result = getDerived().RebuildAutoType(NewDeduced);
430434b41d939a1328f484511c6002ba2456db879a29Richard Smith    if (Result.isNull())
430534b41d939a1328f484511c6002ba2456db879a29Richard Smith      return QualType();
430634b41d939a1328f484511c6002ba2456db879a29Richard Smith  }
430734b41d939a1328f484511c6002ba2456db879a29Richard Smith
430834b41d939a1328f484511c6002ba2456db879a29Richard Smith  AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
430934b41d939a1328f484511c6002ba2456db879a29Richard Smith  NewTL.setNameLoc(TL.getNameLoc());
431034b41d939a1328f484511c6002ba2456db879a29Richard Smith
431134b41d939a1328f484511c6002ba2456db879a29Richard Smith  return Result;
431234b41d939a1328f484511c6002ba2456db879a29Richard Smith}
431334b41d939a1328f484511c6002ba2456db879a29Richard Smith
431434b41d939a1328f484511c6002ba2456db879a29Richard Smithtemplate<typename Derived>
4315a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
431643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                     RecordTypeLoc TL) {
4317f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const RecordType *T = TL.getTypePtr();
4318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
43197c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
43207c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
4321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
4322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
43231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4324a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4326a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
4327a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
4328a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4329a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4330a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
43311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4332a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
4333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
4334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4335a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4339a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
434043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   EnumTypeLoc TL) {
4341f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const EnumType *T = TL.getTypePtr();
4342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
43437c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
43447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
4345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
4346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
43471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4348a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
4350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
4351a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
4352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
4355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4356a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
4357a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
43581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
43617da2431c23ef1ee8acb114e39692246e1801afc2John McCall
43623cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
43633cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
43643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
436543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                         InjectedClassNameTypeLoc TL) {
43663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
43673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
43683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
43693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
43703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
43713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
43723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
43733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
43743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
4375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
4377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
437843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                TemplateTypeParmTypeLoc TL) {
4379a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
4380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
43821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
438349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
4384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
438543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                         SubstTemplateTypeParmTypeLoc TL) {
4386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
438749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
438849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
438949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
4390c3069d618f4661d923cb1b5c4525b082fce73b04Douglas GregorQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
4391c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                          TypeLocBuilder &TLB,
4392c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                          SubstTemplateTypeParmPackTypeLoc TL) {
4393c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  return TransformTypeSpecType(TLB, TL);
4394c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
4395c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
4396c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregortemplate<typename Derived>
4397833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
439843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                        TypeLocBuilder &TLB,
439943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                           TemplateSpecializationTypeLoc TL) {
440043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
4401828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
440243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  TemplateName Template
440343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    = getDerived().TransformTemplateName(T->getTemplateName());
440443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  if (Template.isNull())
440543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    return QualType();
4406833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
440743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
4408dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
440943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
44107ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregornamespace {
44117ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// \brief Simple iterator that traverses the template arguments in a
44127ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// container that provides a \c getArgLoc() member function.
44137ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  ///
44147ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// This iterator is intended to be used with the iterator form of
44157ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  /// \c TreeTransform<Derived>::TransformTemplateArguments().
44167ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  template<typename ArgLocContainer>
44177ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  class TemplateArgumentLocContainerIterator {
44187ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    ArgLocContainer *Container;
44197ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    unsigned Index;
44207ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44217ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  public:
44227ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    typedef TemplateArgumentLoc value_type;
44237ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    typedef TemplateArgumentLoc reference;
44247ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    typedef int difference_type;
44257ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    typedef std::input_iterator_tag iterator_category;
44267ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44277ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    class pointer {
44287ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      TemplateArgumentLoc Arg;
44297ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44307ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    public:
44317ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
44327ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44337ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      const TemplateArgumentLoc *operator->() const {
44347ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor        return &Arg;
44357ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      }
44367ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    };
44377ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44387ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44397ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocContainerIterator() {}
44407ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44417ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
44427ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                 unsigned Index)
44437ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      : Container(&Container), Index(Index) { }
44447ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44457ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocContainerIterator &operator++() {
44467ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      ++Index;
44477ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return *this;
44487ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
44497ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44507ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLocContainerIterator operator++(int) {
44517ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      TemplateArgumentLocContainerIterator Old(*this);
44527ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      ++(*this);
44537ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return Old;
44547ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
44557ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44567ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    TemplateArgumentLoc operator*() const {
44577ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return Container->getArgLoc(Index);
44587ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
44597ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44607ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    pointer operator->() const {
44617ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return pointer(Container->getArgLoc(Index));
44627ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
44637ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44647ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    friend bool operator==(const TemplateArgumentLocContainerIterator &X,
4465f7dd69969aa25093ca9a7897a0d8819c145d1c77Douglas Gregor                           const TemplateArgumentLocContainerIterator &Y) {
44667ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return X.Container == Y.Container && X.Index == Y.Index;
44677ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
44687ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44697ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
4470f7dd69969aa25093ca9a7897a0d8819c145d1c77Douglas Gregor                           const TemplateArgumentLocContainerIterator &Y) {
44717ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor      return !(X == Y);
44727ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    }
44737ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  };
44747ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor}
44757ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
44767ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor
447743fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate <typename Derived>
4478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
4479833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
4480833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
448143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      TemplateName Template) {
4482d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
4483d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
4484d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
44857ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
44867ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor    ArgIterator;
44877ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
44887ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                              ArgIterator(TL, TL.getNumArgs()),
44897ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                              NewTemplateArgs))
44907f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor    return QualType();
44911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4492833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
4493833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
4494833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
4495833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
4496833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
4497d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
44981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4499833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
4500833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
4501833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
4502833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
4503833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
4504833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
4505833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4506833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4507833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
45081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4509833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
4510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
45111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4512a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregortemplate <typename Derived>
4513a88f09f34e86125ee4e6949a757aaed314012664Douglas GregorQualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
4514a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                     TypeLocBuilder &TLB,
4515a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                     DependentTemplateSpecializationTypeLoc TL,
4516a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                     TemplateName Template) {
4517a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  TemplateArgumentListInfo NewTemplateArgs;
4518a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
4519a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
4520a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  typedef TemplateArgumentLocContainerIterator<
4521a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor            DependentTemplateSpecializationTypeLoc> ArgIterator;
4522a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
4523a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                              ArgIterator(TL, TL.getNumArgs()),
4524a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                              NewTemplateArgs))
4525a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    return QualType();
4526a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4527a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  // FIXME: maybe don't rebuild if all the template arguments are the same.
4528a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4529a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
4530a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    QualType Result
4531a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      = getSema().Context.getDependentTemplateSpecializationType(
4532a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                TL.getTypePtr()->getKeyword(),
4533a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                         DTN->getQualifier(),
4534a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                         DTN->getIdentifier(),
4535a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                               NewTemplateArgs);
4536a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4537a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    DependentTemplateSpecializationTypeLoc NewTL
4538a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
4539a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setKeywordLoc(TL.getKeywordLoc());
454094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
454194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // FIXME: Poor nested-name-specifier source-location information.
454294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    CXXScopeSpec SS;
454394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    SS.MakeTrivial(SemaRef.Context,
454494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                   DTN->getQualifier(), TL.getQualifierLoc().getSourceRange());
454594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
4546a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setNameLoc(TL.getNameLoc());
4547a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setLAngleLoc(TL.getLAngleLoc());
4548a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setRAngleLoc(TL.getRAngleLoc());
4549a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4550a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4551a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    return Result;
4552a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  }
4553a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4554a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  QualType Result
4555a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    = getDerived().RebuildTemplateSpecializationType(Template,
4556a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                     TL.getNameLoc(),
4557a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor                                                     NewTemplateArgs);
4558a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4559a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  if (!Result.isNull()) {
4560a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    /// FIXME: Wrap this in an elaborated-type-specifier?
4561a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    TemplateSpecializationTypeLoc NewTL
4562a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      = TLB.push<TemplateSpecializationTypeLoc>(Result);
4563a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setTemplateNameLoc(TL.getNameLoc());
4564a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setLAngleLoc(TL.getLAngleLoc());
4565a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    NewTL.setRAngleLoc(TL.getRAngleLoc());
4566a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
4567a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
4568a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  }
4569a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
4570a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  return Result;
4571a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor}
4572a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
45731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
4575465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
457643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                ElaboratedTypeLoc TL) {
4577f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const ElaboratedType *T = TL.getTypePtr();
4578465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
45799e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  NestedNameSpecifierLoc QualifierLoc;
4580465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  // NOTE: the qualifier in an ElaboratedType is optional.
45819e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  if (TL.getQualifierLoc()) {
45829e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    QualifierLoc
45839e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
45849e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    if (!QualifierLoc)
4585465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return QualType();
4586465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
45871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
458843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
458943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  if (NamedT.isNull())
459043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    return QualType();
4591a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar
4592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
4593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
45949e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor      QualifierLoc != TL.getQualifierLoc() ||
4595e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      NamedT != T->getNamedType()) {
459621e413fe6305a198564d436ac515497716c47844John McCall    Result = getDerived().RebuildElaboratedType(TL.getKeywordLoc(),
45979e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                                T->getKeyword(),
45989e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor                                                QualifierLoc, NamedT);
4599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
4600a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
4601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
4602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4603465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
4604e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setKeywordLoc(TL.getKeywordLoc());
46059e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor  NewTL.setQualifierLoc(QualifierLoc);
4606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
46081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
46109d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallQualType TreeTransform<Derived>::TransformAttributedType(
46119d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                                TypeLocBuilder &TLB,
46129d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                                AttributedTypeLoc TL) {
46139d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  const AttributedType *oldType = TL.getTypePtr();
46149d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
46159d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (modifiedType.isNull())
46169d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    return QualType();
46179d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
46189d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  QualType result = TL.getType();
46199d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
46209d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  // FIXME: dependent operand expressions?
46219d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (getDerived().AlwaysRebuild() ||
46229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      modifiedType != oldType->getModifiedType()) {
46239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    // TODO: this is really lame; we should really be rebuilding the
46249d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    // equivalent type from first principles.
46259d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    QualType equivalentType
46269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      = getDerived().TransformType(oldType->getEquivalentType());
46279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    if (equivalentType.isNull())
46289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      return QualType();
46299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
46309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                               modifiedType,
46319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                               equivalentType);
46329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  }
46339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
46349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
46359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  newTL.setAttrNameLoc(TL.getAttrNameLoc());
46369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (TL.hasAttrOperand())
46379d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
46389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  if (TL.hasAttrExprOperand())
46399d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    newTL.setAttrExprOperand(TL.getAttrExprOperand());
46409d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  else if (TL.hasAttrEnumOperand())
46419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
46429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
46439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  return result;
46449d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
46459d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
46469d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCalltemplate<typename Derived>
4647075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraQualType
4648075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo BagnaraTreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
4649075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara                                           ParenTypeLoc TL) {
4650075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
4651075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (Inner.isNull())
4652075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    return QualType();
4653075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
4654075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  QualType Result = TL.getType();
4655075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  if (getDerived().AlwaysRebuild() ||
4656075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      Inner != TL.getInnerLoc().getType()) {
4657075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    Result = getDerived().RebuildParenType(Inner);
4658075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    if (Result.isNull())
4659075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      return QualType();
4660075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
4661075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
4662075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
4663075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  NewTL.setLParenLoc(TL.getLParenLoc());
4664075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  NewTL.setRParenLoc(TL.getRParenLoc());
4665075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  return Result;
4666075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara}
4667075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
4668075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaratemplate<typename Derived>
46694714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
467043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                      DependentNameTypeLoc TL) {
4671f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DependentNameType *T = TL.getTypePtr();
4672833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
46732494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  NestedNameSpecifierLoc QualifierLoc
46742494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
46752494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor  if (!QualifierLoc)
4676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
46771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
467833500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result
46792494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    = getDerived().RebuildDependentNameType(T->getKeyword(),
468033500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getKeywordLoc(),
46812494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                            QualifierLoc,
46822494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor                                            T->getIdentifier(),
468333500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getNameLoc());
4684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
4685a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
4686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
4687e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
4688e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    QualType NamedT = ElabT->getNamedType();
468933500955d731c73717af52088b7fc0e7a85681e7John McCall    TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
469033500955d731c73717af52088b7fc0e7a85681e7John McCall
4691e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
4692e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
46939e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    NewTL.setQualifierLoc(QualifierLoc);
469433500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
4695e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
4696e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
46972494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor    NewTL.setQualifierLoc(QualifierLoc);
4698e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setNameLoc(TL.getNameLoc());
4699e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
4700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
4701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
47021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
470433500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>::
470533500955d731c73717af52088b7fc0e7a85681e7John McCall          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
470643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                 DependentTemplateSpecializationTypeLoc TL) {
470794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  NestedNameSpecifierLoc QualifierLoc;
470894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (TL.getQualifierLoc()) {
470994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    QualifierLoc
471094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
471194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    if (!QualifierLoc)
4712a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor      return QualType();
4713a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor  }
4714a88f09f34e86125ee4e6949a757aaed314012664Douglas Gregor
471543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return getDerived()
471694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor           .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
471743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall}
471843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
471943fed0de4f5bc189e45562491f83d5193eb8dac0John McCalltemplate<typename Derived>
472043fed0de4f5bc189e45562491f83d5193eb8dac0John McCallQualType TreeTransform<Derived>::
472143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
472243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                 DependentTemplateSpecializationTypeLoc TL,
472343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                  NestedNameSpecifier *NNS) {
472494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  // FIXME: This routine needs to go away.
4725f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  const DependentTemplateSpecializationType *T = TL.getTypePtr();
472643fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
472733500955d731c73717af52088b7fc0e7a85681e7John McCall  TemplateArgumentListInfo NewTemplateArgs;
472833500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
472933500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
4730c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor
4731c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor  // FIXME: Nested-name-specifier source location info!
47327ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  typedef TemplateArgumentLocContainerIterator<
47337ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                            DependentTemplateSpecializationTypeLoc> ArgIterator;
47347ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor  if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
47357ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                              ArgIterator(TL, TL.getNumArgs()),
47367ca7ac40ad45d5253ba474dddfa5ee233f35c2feDouglas Gregor                                              NewTemplateArgs))
47377f61f2fc1a880ac3bf5b0993525922dd2c1f09bfDouglas Gregor    return QualType();
473833500955d731c73717af52088b7fc0e7a85681e7John McCall
4739fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  CXXScopeSpec SS;
4740fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  SS.MakeTrivial(SemaRef.Context, NNS,
4741fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                 TL.getQualifierLoc().getSourceRange());
47421efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor  QualType Result
47431efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor    = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
4744fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                        SS.getWithLocInContext(SemaRef.Context),
47451efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor                                                            T->getIdentifier(),
47461efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor                                                              TL.getNameLoc(),
47471efb6c716397f2c4e3ede3a4853c5efebb375441Douglas Gregor                                                              NewTemplateArgs);
474833500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Result.isNull())
474933500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
475033500955d731c73717af52088b7fc0e7a85681e7John McCall
475133500955d731c73717af52088b7fc0e7a85681e7John McCall  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
475233500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType NamedT = ElabT->getNamedType();
475333500955d731c73717af52088b7fc0e7a85681e7John McCall
475433500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the template specialization.
475533500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateSpecializationTypeLoc NamedTL
475633500955d731c73717af52088b7fc0e7a85681e7John McCall      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
475733500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setLAngleLoc(TL.getLAngleLoc());
475833500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setRAngleLoc(TL.getRAngleLoc());
475933500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
476033500955d731c73717af52088b7fc0e7a85681e7John McCall      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
476133500955d731c73717af52088b7fc0e7a85681e7John McCall
476233500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the elaborated type.
476333500955d731c73717af52088b7fc0e7a85681e7John McCall    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
476433500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setKeywordLoc(TL.getKeywordLoc());
47659e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor
47669e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    // FIXME: DependentTemplateSpecializationType needs better source-location
47679e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    // info.
47689e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    NestedNameSpecifierLocBuilder Builder;
476994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    Builder.MakeTrivial(SemaRef.Context,
477094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                        NNS, TL.getQualifierLoc().getSourceRange());
47719e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    NewTL.setQualifierLoc(Builder.getWithLocInContext(SemaRef.Context));
477233500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
4773e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TypeLoc NewTL(Result, TL.getOpaqueData());
4774e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TLB.pushFullCopy(NewTL);
477533500955d731c73717af52088b7fc0e7a85681e7John McCall  }
477633500955d731c73717af52088b7fc0e7a85681e7John McCall  return Result;
477733500955d731c73717af52088b7fc0e7a85681e7John McCall}
477833500955d731c73717af52088b7fc0e7a85681e7John McCall
477933500955d731c73717af52088b7fc0e7a85681e7John McCalltemplate<typename Derived>
478094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorQualType TreeTransform<Derived>::
478194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas GregorTransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
478294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                   DependentTemplateSpecializationTypeLoc TL,
478394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                       NestedNameSpecifierLoc QualifierLoc) {
478494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  const DependentTemplateSpecializationType *T = TL.getTypePtr();
478594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
478694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  TemplateArgumentListInfo NewTemplateArgs;
478794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
478894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
478994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
479094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  typedef TemplateArgumentLocContainerIterator<
479194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  DependentTemplateSpecializationTypeLoc> ArgIterator;
479294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
479394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                              ArgIterator(TL, TL.getNumArgs()),
479494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                              NewTemplateArgs))
479594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    return QualType();
479694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
479794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  QualType Result
479894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
479994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                              QualifierLoc,
480094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                            T->getIdentifier(),
480194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                            TL.getNameLoc(),
480294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor                                                            NewTemplateArgs);
480394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (Result.isNull())
480494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    return QualType();
480594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
480694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
480794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    QualType NamedT = ElabT->getNamedType();
480894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
480994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // Copy information relevant to the template specialization.
481094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    TemplateSpecializationTypeLoc NamedTL
481194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
481294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NamedTL.setLAngleLoc(TL.getLAngleLoc());
481394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NamedTL.setRAngleLoc(TL.getRAngleLoc());
481494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
481594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
481694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
481794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    // Copy information relevant to the elaborated type.
481894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
481994fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NewTL.setKeywordLoc(TL.getKeywordLoc());
482094fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    NewTL.setQualifierLoc(QualifierLoc);
482194fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  } else {
482294fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    TypeLoc NewTL(Result, TL.getOpaqueData());
482394fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor    TLB.pushFullCopy(NewTL);
482494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  }
482594fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  return Result;
482694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor}
482794fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
482894fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregortemplate<typename Derived>
48297536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorQualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
48307536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor                                                      PackExpansionTypeLoc TL) {
48312fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  QualType Pattern
48322fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    = getDerived().TransformType(TLB, TL.getPatternLoc());
48332fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  if (Pattern.isNull())
48342fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    return QualType();
48352fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
48362fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  QualType Result = TL.getType();
48372fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  if (getDerived().AlwaysRebuild() ||
48382fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor      Pattern != TL.getPatternLoc().getType()) {
48392fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    Result = getDerived().RebuildPackExpansionType(Pattern,
48402fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor                                           TL.getPatternLoc().getSourceRange(),
4841cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                                   TL.getEllipsisLoc(),
4842cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                           TL.getTypePtr()->getNumExpansions());
48432fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    if (Result.isNull())
48442fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor      return QualType();
48452fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  }
48462fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
48472fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
48482fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  NewT.setEllipsisLoc(TL.getEllipsisLoc());
48492fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  return Result;
48507536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
48517536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
48527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregortemplate<typename Derived>
4853a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
4854a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
485543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                   ObjCInterfaceTypeLoc TL) {
4856ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCInterfaceType is never dependent.
4857c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
4858c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return TL.getType();
4859c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
4860c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
4861c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived>
4862c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType
4863c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
486443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                                ObjCObjectTypeLoc TL) {
4865c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCObjectType is never dependent.
4866c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
4867ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
4868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
48691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
4872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
487343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                               ObjCObjectPointerTypeLoc TL) {
4874ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCObjectPointerType is never dependent.
4875c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
4876ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
487724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
487824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
4879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
488043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
488143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
488243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
488360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
48841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
48853fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(S);
488643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
488743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
488843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
488960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
489043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
489143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
489243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
489343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
489443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
489560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
48961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
489743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
48987114cbab7eb6e8b714eb22f014327daf2c741c08John McCall  bool SubStmtInvalid = false;
489943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
4900ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Statements(getSema());
490143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
490243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
490360d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Result = getDerived().TransformStmt(*B);
49047114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    if (Result.isInvalid()) {
49057114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // Immediately fail if this was a DeclStmt, since it's very
49067114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // likely that this will cause problems for future statements.
49077114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      if (isa<DeclStmt>(*B))
49087114cbab7eb6e8b714eb22f014327daf2c741c08John McCall        return StmtError();
49097114cbab7eb6e8b714eb22f014327daf2c741c08John McCall
49107114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // Otherwise, just keep processing substatements and fail later.
49117114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      SubStmtInvalid = true;
49127114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      continue;
49137114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    }
49141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
491543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
491643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
491743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
49181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49197114cbab7eb6e8b714eb22f014327daf2c741c08John McCall  if (SubStmtInvalid)
49207114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    return StmtError();
49217114cbab7eb6e8b714eb22f014327daf2c741c08John McCall
492243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
492343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
49243fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
492543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
492643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
492743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
492843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
492943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
493043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
49311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
493243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
493360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
493560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS, RHS;
4936264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
4937264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
4938f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
49391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4940264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
4941264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
4942264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
4943f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
49441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4945264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
4946264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
4947264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
4948f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
4949264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
49501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
495143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
495243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
495343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
495460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
49559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       LHS.get(),
495643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
49579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       RHS.get(),
495843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
495943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
4960f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
49611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
496243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
496360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
496443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
4965f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
49661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
496743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
49689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
496943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
497043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
497143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
497260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
497443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
497560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
497643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
4977f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
49781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
497943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
498043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
49819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubStmt.get());
498243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
49831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
498443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
498560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
49861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
498760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
498843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
4989f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
49901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
499157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
499257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                        S->getDecl());
499357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  if (!LD)
499457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return StmtError();
499557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
499657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
499743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
4998ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  return getDerived().RebuildLabelStmt(S->getIdentLoc(),
499957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                       cast<LabelDecl>(LD), SourceLocation(),
500057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                       SubStmt.get());
500143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
50021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
500343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
500460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
50051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
500643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
500760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
50088cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
50098cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
5010c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
50118cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
5012aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
5013aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
5014aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
50158cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
5016f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
501799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
50188cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
5019c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
502099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
5021f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5022eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
5023eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    // Convert the condition to a boolean value.
5024afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
50258491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(),
50268491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                                         Cond.get());
5027afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
5028f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
5029eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
50309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE.get();
5031afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
503299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
5033c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
50349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
50359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5036f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5037eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
503843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
503960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Then = getDerived().TransformStmt(S->getThen());
504043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
5041f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
50421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
504343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
504460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Else = getDerived().TransformStmt(S->getElse());
504543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
5046f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
50471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
504843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
50499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
505099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
505143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
505243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
50533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
50541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5055eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
505644aa1f397855f130e88e62ffc1029f7f83bb5d2eArgyrios Kyrtzidis                                    Then.get(),
50579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    S->getElseLoc(), Else.get());
505843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
505943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
506043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
506160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
50621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
506343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
506460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
5065d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
5066d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
5067c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
5068d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
5069aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
5070aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
5071aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
5072d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
5073f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
507499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
5075d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
5076c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
507799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
5078f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
507999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
50801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
508143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
508260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Switch
50839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
5084586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          ConditionVar);
508543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
5086f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
50871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
508843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
508960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
509043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
5091f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
50921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
509343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
50949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
50959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Body.get());
509643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
50971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
509843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
509960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
51001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
510143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
510260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
51035656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
51045656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
5105c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
51065656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
5107aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
5108aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
5109aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
51105656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
5111f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
511299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
51135656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
5114c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
511599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
5116f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5117afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
5118afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
5119afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
51208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(),
51218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                                         Cond.get());
5122afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
5123f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
51249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE;
5125afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
512699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
51271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
51299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5130f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5131eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
513243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
513360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
513443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
5135f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
51361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
513743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
51389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
513999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
514043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
51419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(S);
51421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5143eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
51449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       ConditionVar, Body.get());
514543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
51461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
514743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
514860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
514943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
515043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
515160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
515243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
5153f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
51541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5155eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  // Transform the condition
515660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(S->getCond());
5157eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (Cond.isInvalid())
5158f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5159eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
516043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
516143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
516243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
51633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
51641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
51669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    /*FIXME:*/S->getWhileLoc(), Cond.get(),
516743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
516843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
517043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
517160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
51721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
517343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
517460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Init = getDerived().TransformStmt(S->getInit());
517543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
5176f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
51771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
517843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
517960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond;
518099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
518199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
5182c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
518399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
5184aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
5185aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
5186aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
518799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
5188f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
518999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
519099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
5191c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
519299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
5193f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5194afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
5195afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
5196afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
51978491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor      ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(),
51988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor                                                         Cond.get());
5199afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
5200f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
5201afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
52029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE.get();
5203afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
520499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
52051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
52079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5208f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5209eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
521043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
521160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Inc = getDerived().TransformExpr(S->getInc());
521243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
5213f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
52141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get()));
52169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (S->getInc() && !FullInc.get())
5217f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5218eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
521943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
522060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
522143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
5222f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
52231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
522443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
522543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
52269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
522743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
522843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
52293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
52301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
523143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
52329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Init.get(), FullCond, ConditionVar,
52339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     FullInc, S->getRParenLoc(), Body.get());
523443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
523543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
523643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
523760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
52381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
523957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
524057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                        S->getLabel());
524157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  if (!LD)
524257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return StmtError();
524357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
524443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
52451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
524657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                      cast<LabelDecl>(LD));
524743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
524843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
524943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
525060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
52511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
525260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Target = getDerived().TransformExpr(S->getTarget());
525343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
5254f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
52551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
525643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
525743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
52583fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
525943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
526043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
52619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Target.get());
526243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
526343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
526443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
526560d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
52661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
52673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(S);
526843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
52691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
527043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
527160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
52721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
52733fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(S);
527443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
52751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
527643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
527760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
52781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
527960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Result = getDerived().TransformExpr(S->getRetValue());
528043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
5281f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
528243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
52831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
528443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
52859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
528643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
52871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
528843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
528960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
52901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
529143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
529243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
529343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
529443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
5295aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
5296aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                         *D);
529743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
5298f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
52991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
530043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
530143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
53021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
530343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
530443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
53051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
530643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
53073fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
53081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
531043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
531143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
53121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
531343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
531460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
531543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
5316c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5317ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Constraints(getSema());
5318ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Exprs(getSema());
5319ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 4> Names;
5320a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
532160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult AsmString;
5322ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Clobbers(getSema());
5323703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
5324703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  bool ExprsChanged = false;
5325c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5326703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the outputs.
5327703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
5328ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getOutputIdentifier(I));
5329c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5330703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
53313fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    Constraints.push_back(S->getOutputConstraintLiteral(I));
5332c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5333703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the output expr.
5334703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *OutputExpr = S->getOutputExpr(I);
533560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getDerived().TransformExpr(OutputExpr);
5336703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
5337f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5338c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5339703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != OutputExpr;
5340c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
53419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Exprs.push_back(Result.get());
5342703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
5343c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5344703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the inputs.
5345703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
5346ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getInputIdentifier(I));
5347c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5348703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
53493fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    Constraints.push_back(S->getInputConstraintLiteral(I));
5350c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5351703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the input expr.
5352703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *InputExpr = S->getInputExpr(I);
535360d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getDerived().TransformExpr(InputExpr);
5354703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
5355f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5356c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5357703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != InputExpr;
5358c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
53599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Exprs.push_back(Result.get());
5360703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
5361c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5362703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
53633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
5364703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
5365703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the clobbers.
5366703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
53673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    Clobbers.push_back(S->getClobber(I));
5368703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
5369703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // No need to transform the asm string literal.
5370703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  AsmString = SemaRef.Owned(S->getAsmString());
5371703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
5372703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
5373703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isSimple(),
5374703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isVolatile(),
5375703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumOutputs(),
5376703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumInputs(),
5377a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson                                     Names.data(),
5378703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Constraints),
5379703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Exprs),
53809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     AsmString.get(),
5381703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Clobbers),
5382703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getRParenLoc(),
5383703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isMSAsm());
538443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
538543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
538643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
538743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
538860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
53891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
53904dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body of the @try.
539160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
53924dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (TryBody.isInvalid())
5393f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5394c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
53958f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  // Transform the @catch statements (if present).
53968f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool AnyCatchChanged = false;
5397ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> CatchStmts(SemaRef);
53988f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
539960d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
54004dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Catch.isInvalid())
5401f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
54028f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    if (Catch.get() != S->getCatchStmt(I))
54038f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      AnyCatchChanged = true;
54048f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    CatchStmts.push_back(Catch.release());
54054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
5406c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the @finally statement (if present).
540860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Finally;
54094dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (S->getFinallyStmt()) {
54104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    Finally = getDerived().TransformStmt(S->getFinallyStmt());
54114dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Finally.isInvalid())
5412f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
54134dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
54144dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
54154dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
54164dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
54174dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      TryBody.get() == S->getTryBody() &&
54188f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      !AnyCatchChanged &&
54194dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Finally.get() == S->getFinallyStmt())
54203fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
5421c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54224dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
54239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
54249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           move_arg(CatchStmts), Finally.get());
542543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
54261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
542743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
542860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
54291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
5430be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  // Transform the @catch parameter, if there is one.
5431be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *Var = 0;
5432be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (VarDecl *FromVar = S->getCatchParamDecl()) {
5433be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    TypeSourceInfo *TSInfo = 0;
5434be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (FromVar->getTypeSourceInfo()) {
5435be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
5436be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (!TSInfo)
5437f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
5438be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
5439c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5440be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    QualType T;
5441be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (TSInfo)
5442be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = TSInfo->getType();
5443be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    else {
5444be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = getDerived().TransformType(FromVar->getType());
5445be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (T.isNull())
5446f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
5447be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
5448c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5449be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
5450be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (!Var)
5451f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5452be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
5453c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
545460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
5455be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (Body.isInvalid())
5456f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5457c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5458c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
5459be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             S->getRParenLoc(),
54609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Var, Body.get());
546143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
54621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
546343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
546460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
54651eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
54664dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body.
546760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
54684dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (Body.isInvalid())
5469f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5470c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54714dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
54724dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
54734dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Body.get() == S->getFinallyBody())
54743fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
54754dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
54764dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
54774dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
54789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                               Body.get());
547943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
54801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
548143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
548260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
54831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
548460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Operand;
5485d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (S->getThrowExpr()) {
5486d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    Operand = getDerived().TransformExpr(S->getThrowExpr());
5487d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    if (Operand.isInvalid())
5488f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
5489d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
5490c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5491d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5492d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      Operand.get() == S->getThrowExpr())
54933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return getSema().Owned(S);
5494c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
549643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
54971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
549843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
549960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
550043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
55011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
55028fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the object we are locking.
550360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
55048fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Object.isInvalid())
5505f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5506c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
55078fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the body.
550860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
55098fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Body.isInvalid())
5510f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5511c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
55128fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // If nothing change, just retain the current statement.
55138fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
55148fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Object.get() == S->getSynchExpr() &&
55158fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Body.get() == S->getSynchBody())
55163fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
55178fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor
55188fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Build a new statement.
55198fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
55209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    Object.get(), Body.get());
552143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
552243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
552343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
552460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
552543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
55261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
5527c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the element statement.
552860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Element = getDerived().TransformStmt(S->getElement());
5529c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Element.isInvalid())
5530f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5531c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5532c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the collection expression.
553360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Collection = getDerived().TransformExpr(S->getCollection());
5534c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Collection.isInvalid())
5535f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5536c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5537c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the body.
553860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
5539c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Body.isInvalid())
5540f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
5541c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5542c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // If nothing changed, just retain this statement.
5543c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
5544c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Element.get() == S->getElement() &&
5545c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Collection.get() == S->getCollection() &&
5546c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Body.get() == S->getBody())
55473fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
5548c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5549c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Build a new statement.
5550c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
5551c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   /*FIXME:*/S->getForLoc(),
55529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Element.get(),
55539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Collection.get(),
5554c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   S->getRParenLoc(),
55559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Body.get());
555643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
555743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
555843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
555943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
556060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
556143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
556243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
556343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
556443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
556543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
556683cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor    TypeSourceInfo *T = getDerived().TransformType(
556783cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor                                            ExceptionDecl->getTypeSourceInfo());
556883cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor    if (!T)
5569f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
557183cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T,
557243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
557383cb94269015bf2770ade71e616c5322ea7e76e1Douglas Gregor                                            ExceptionDecl->getLocation());
5574ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor    if (!Var || Var->isInvalidDecl())
5575f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
557643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
55771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
557843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
557960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
5580ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor  if (Handler.isInvalid())
5581f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
55821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
558343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
558443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
558543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
55863fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
558743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
558843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
558943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
55909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Handler.get());
559143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
55921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
559343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
559460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
559543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
559643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
559760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TryBlock
559843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
559943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
5600f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
56011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
560243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
560343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
5604ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Handlers(SemaRef);
560543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
560660d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Handler
560743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
560843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
5609f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
56101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
561143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
561243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
561343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
56141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
561543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
561643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
561743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
56183fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(S);
561943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
56209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
56211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
562243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
56231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
562443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
5625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
5626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
56271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
562860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5629454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
56303fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
56311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
56321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
563460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5635454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
563640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  NestedNameSpecifierLoc QualifierLoc;
563740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  if (E->getQualifierLoc()) {
563840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    QualifierLoc
563940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
564040d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    if (!QualifierLoc)
5641f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5642a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
5643dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
5644dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
56457c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
56467c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getDecl()));
5647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
5648f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
56491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5650ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  DeclarationNameInfo NameInfo = E->getNameInfo();
5651ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  if (NameInfo.getName()) {
5652ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
5653ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    if (!NameInfo.getName())
5654f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5655ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  }
56562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
56572577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!getDerived().AlwaysRebuild() &&
565840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      QualifierLoc == E->getQualifierLoc() &&
5659a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
56602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NameInfo.getName() == E->getDecl()->getDeclName() &&
5661096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
56621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5663dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
5664dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
5665dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
5666a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
56673fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
5668a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
5669dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
5670dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
5671096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
5672dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
5673dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
5674dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
5675fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
5676fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                E->getNumTemplateArgs(),
5677fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                TransArgs))
5678fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor      return ExprError();
5679dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
5680dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
568140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
568240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                                         TemplateArgs);
5683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
56841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
568660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5687454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
56883fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
56901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
569260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5693454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
56943fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
569860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5699454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
57003fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
570460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5705454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
57063fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
571060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5711454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
57123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
5713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
571660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5717454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
571860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5720f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
57211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
57233fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
57241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
5726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
5727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
57291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
573060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5731454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
573260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5734f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
57351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
57373fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
57381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
5740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
57419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get());
5742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
574560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
57468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
57478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform the type.
57488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
57498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!Type)
5750f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
5751c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
57528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform all of the components into components similar to what the
57538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // parser uses.
5754c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // FIXME: It would be slightly more efficient in the non-dependent case to
5755c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // just map FieldDecls, rather than requiring the rebuilder to look for
5756c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // the fields again. However, __builtin_offsetof is rare enough in
57578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // template code that we don't care.
57588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool ExprChanged = false;
5759f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  typedef Sema::OffsetOfComponent Component;
57608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
57618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  llvm::SmallVector<Component, 4> Components;
57628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
57638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    const Node &ON = E->getComponent(I);
57648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Component Comp;
576572be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor    Comp.isBrackets = true;
57668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocStart = ON.getRange().getBegin();
57678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocEnd = ON.getRange().getEnd();
57688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
57698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array: {
57708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
577160d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Index = getDerived().TransformExpr(FromIndex);
57728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (Index.isInvalid())
5773f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
5774c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
57758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      ExprChanged = ExprChanged || Index.get() != FromIndex;
57768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = true;
57779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Comp.U.E = Index.get();
57788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
57798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
5780c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
57818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
57828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
57838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = false;
57848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.IdentInfo = ON.getFieldName();
578529d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor      if (!Comp.U.IdentInfo)
578629d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor        continue;
5787c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
57888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
5789c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5790cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case Node::Base:
5791cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Will be recomputed during the rebuild.
5792cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
57938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
5794c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
57958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Components.push_back(Comp);
57968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
5797c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
57988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // If nothing changed, retain the existing expression.
57998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
58008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Type == E->getTypeSourceInfo() &&
58018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      !ExprChanged)
58023fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
5803c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
58048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Build a new offsetof expression.
58058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
58068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          Components.data(), Components.size(),
58078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          E->getRParenLoc());
58087cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall}
58097cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
58107cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCalltemplate<typename Derived>
58117cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallExprResult
58127cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallTreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
58137cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  assert(getDerived().AlreadyTransformed(E->getType()) &&
58147cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall         "opaque value expression requires transformation");
58157cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  return SemaRef.Owned(E);
58168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
58178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
58188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived>
581960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5820454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
5821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
5822a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
58235557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
5824a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
58255ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
5826f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
58271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58285ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
58293fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
58301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58315ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
58321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
5833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
5834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
58351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
583660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr;
58371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
5838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
5839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
5840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
5841f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
58421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
5844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
5845f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
58461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
58483fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
5849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
58501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildSizeOfAlignOf(SubExpr.get(), E->getOperatorLoc(),
5852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
5853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
5854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
58551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
585760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5858454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
585960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
5860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
5861f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
58621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
586360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
5864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
5865f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
58661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
5870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
58713fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
58721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildArraySubscriptExpr(LHS.get(),
5874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
58759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                RHS.get(),
5876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
5877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
58781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
588060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5881454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
5882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
588360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
5884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
5885f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
5886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
5888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
5889ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
5890aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
5891aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  &ArgChanged))
5892aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
5893aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
5894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
5896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
58973fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
58981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
59001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
5901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
59029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
5903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
5904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
5905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
59071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
590860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5909454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
591060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
5911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
5912f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
59131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
591440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  NestedNameSpecifierLoc QualifierLoc;
591583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
591640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    QualifierLoc
591740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
591840d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor
591940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    if (!QualifierLoc)
5920f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
592183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
59221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5923f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
59247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
59257c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getMemberDecl()));
5926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
5927f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
59281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
59296bb8017bb9e828d118e15e59d71c66bba323c364John McCall  NamedDecl *FoundDecl = E->getFoundDecl();
59306bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (FoundDecl == E->getMemberDecl()) {
59316bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = Member;
59326bb8017bb9e828d118e15e59d71c66bba323c364John McCall  } else {
59336bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = cast_or_null<NamedDecl>(
59346bb8017bb9e828d118e15e59d71c66bba323c364John McCall                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
59356bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!FoundDecl)
5936f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
59376bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
59386bb8017bb9e828d118e15e59d71c66bba323c364John McCall
5939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
594140d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      QualifierLoc == E->getQualifierLoc() &&
59428a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
59436bb8017bb9e828d118e15e59d71c66bba323c364John McCall      FoundDecl == E->getFoundDecl() &&
5944096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
5945c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
59461f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
59471f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
59481f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
59493fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
59501f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
5951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5952d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
5953096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
5954d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
5955d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
5956fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
5957fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                E->getNumTemplateArgs(),
5958fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                TransArgs))
5959fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor      return ExprError();
59608a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
5961c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
5963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
5964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
5965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5966c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5967c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5968c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5969c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5970c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5971c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
59729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
5973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
597440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                                        QualifierLoc,
59752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                        E->getMemberNameInfo(),
59768a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
59776bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                        FoundDecl,
5978096832c5ed5b9106fa177ebc148489760c3bc496John McCall                                        (E->hasExplicitTemplateArgs()
5979d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
5980c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
5981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
598460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5985454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
598660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
5987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
5988f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
59891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
599060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
5991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
5992f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
59931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
5996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
59973fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
59981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
60009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            LHS.get(), RHS.get());
6001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
600460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
6006454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
6007454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
6008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
601156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallExprResult TreeTransform<Derived>::
601256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallTransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
601356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // Just rebuild the common and RHS expressions and see whether we
601456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // get any changes.
601556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
601656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
601756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (commonExpr.isInvalid())
601856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return ExprError();
601956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
602056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
602156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (rhs.isInvalid())
602256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return ExprError();
602356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
602456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (!getDerived().AlwaysRebuild() &&
602556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      commonExpr.get() == e->getCommon() &&
602656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      rhs.get() == e->getFalseExpr())
602756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return SemaRef.Owned(e);
602856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
602956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  return getDerived().RebuildConditionalOperator(commonExpr.take(),
603056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                 e->getQuestionLoc(),
603156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                 0,
603256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                 e->getColonLoc(),
603356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall                                                 rhs.get());
603456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
603556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
603656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCalltemplate<typename Derived>
603760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6038454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
603960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(E->getCond());
6040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
6041f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
60421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
604360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
6044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
6045f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
60461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
604760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
6048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
6049f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
60501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
6053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
6054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
60553fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
60561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildConditionalOperator(Cond.get(),
605847e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
60599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 LHS.get(),
606047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
60619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 RHS.get());
6062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
606560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
6067a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
6068a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
60696eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
6070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
607360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6074454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
6075ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
6076ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  if (!Type)
6077ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor    return ExprError();
6078ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor
607960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
60806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
6081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6082f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
60831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6085ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor      Type == E->getTypeInfoAsWritten() &&
6086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
60873fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
60881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60899d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
6090ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor                                            Type,
6091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
60929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            SubExpr.get());
6093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
609660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6097454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
609842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
609942f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
610042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
6101f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
61021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
610360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Init = getDerived().TransformExpr(E->getInitializer());
6104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
6105f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
61061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
610842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      OldT == NewT &&
6109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
61103fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
6111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61121d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // Note: the expression type doesn't necessarily match the
61131d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // type-as-written, but that's okay, because it should always be
61141d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // derivable from the initializer.
61151d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
611642f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
6117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
61189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Init.get());
6119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
61201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
612260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6123454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
612460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
6126f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
61271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
61303fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
61311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
61331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
6134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
61359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
6136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
6137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
6138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
61391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
614160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6142454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
6143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
61441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6145ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> Inits(SemaRef);
6146aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
6147aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  Inits, &InitChanged))
6148aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
6149aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
6150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
61513fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
61521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
6154e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
6155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
61561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
615860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6159454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
6160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
61611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
616243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
616360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Init = getDerived().TransformExpr(E->getInit());
6164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
6165f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
61661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
616743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
6168ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef);
6169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
6170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
6171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
6172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
6173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
6174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
6175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
6176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
6177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
6178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
61791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
618160d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
6182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
6183f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
61841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
6186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
61871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
6189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
6190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
6191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
61921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
619460d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Start
6195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
6196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
6197f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
61981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
619960d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
6200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
6201f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
62021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
6204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
6205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
6206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
62071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
6209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
62101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
6212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
6213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
62141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
6217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
62183fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
62191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
6221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
62229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                E->usesGNUSyntax(), Init.get());
6223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
622660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
6228454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
62295557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
6230c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
62315557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
62325557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
6233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
6234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
6235f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
62361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
62393fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
62401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
6242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
624560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6246454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
62479bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
62489bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo)
6249f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
62501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
625160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
6252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6253f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
62541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
62562cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara      TInfo == E->getWrittenTypeInfo() &&
6257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
62583fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
62591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
62612cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                       TInfo, E->getRParenLoc());
6262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
626560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6266454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
6267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6268ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> Inits(SemaRef);
6269aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
6270aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                     &ArgumentChanged))
6271aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
6272aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
6273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
6274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
6275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
6276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
6279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
6280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
6281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
6282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
6283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
628460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6285454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
628657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
628757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                        E->getLabel());
628857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner  if (!LD)
628957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner    return ExprError();
629057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner
6291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
629257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner                                           cast<LabelDecl>(LD));
6293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
629660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6297454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
629860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt
6299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
6300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
6301f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
63021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
63053fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
63061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
63089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      SubStmt.get(),
6309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
6310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
63111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
631360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6314454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
631560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(E->getCond());
6316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
6317f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
63181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
631960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
6320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
6321f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
63221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
632360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
6324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
6325f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
63261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
6329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
6330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
63313fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
63321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
63349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Cond.get(), LHS.get(), RHS.get(),
6335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
6336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
63371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
633960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6340454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
63413fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
6342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
634560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6346454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
6347668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
6348668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
6349668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
6350668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
6351668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
6352668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
6353f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6354c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6355668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
6356668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
6357668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
6358668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6359668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
636060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Object = getDerived().TransformExpr(E->getArg(0));
6361668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
6362f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6363668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6364668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
6365668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
6366668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
6367668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
6368668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6369668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
6370ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> Args(SemaRef);
6371aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
6372aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                    Args))
6373aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor      return ExprError();
6374668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
63759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
6376668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
6377668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
6378668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
6379668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6380668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
6381668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
6382668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
6383668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
6384668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
6385668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
6386668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
6387668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6388668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
6389668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
6390f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6391668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
6392668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
6393668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
6394668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
6395f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6396668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
6397668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
639860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
6399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
6400f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
64011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
640260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult First = getDerived().TransformExpr(E->getArg(0));
6403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
6404f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
640660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Second;
6407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
6408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
6409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
6410f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
64121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
6415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
64161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
64173fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
64181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
6420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
64219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Callee.get(),
64229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 First.get(),
64239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Second.get());
6424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
64251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
642760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6428454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
6429454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
6430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
64311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6433e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneExprResult
6434e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter CollingbourneTreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
6435e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  // Transform the callee.
6436e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
6437e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  if (Callee.isInvalid())
6438e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    return ExprError();
6439e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6440e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  // Transform exec config.
6441e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
6442e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  if (EC.isInvalid())
6443e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    return ExprError();
6444e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6445e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  // Transform arguments.
6446e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  bool ArgChanged = false;
6447e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  ASTOwningVector<Expr*> Args(SemaRef);
6448e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
6449e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                  &ArgChanged))
6450e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    return ExprError();
6451e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6452e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  if (!getDerived().AlwaysRebuild() &&
6453e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne      Callee.get() == E->getCallee() &&
6454e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne      !ArgChanged)
6455e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    return SemaRef.Owned(E);
6456e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6457e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  // FIXME: Wrong source location information for the '('.
6458e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  SourceLocation FakeLParenLoc
6459e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    = ((Expr *)Callee.get())->getSourceRange().getBegin();
6460e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
6461e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                      move_arg(Args),
6462e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne                                      E->getRParenLoc(), EC.get());
6463e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}
6464e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
6465e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournetemplate<typename Derived>
646660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6467454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
6468ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
6469ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  if (!Type)
6470ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor    return ExprError();
6471ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor
647260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
64736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
6474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6475f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
64761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6478ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor      Type == E->getTypeInfoAsWritten() &&
6479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
64803fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
64811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
64831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
6484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
6485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
6486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
6487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
6488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
6489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
64901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
6491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
6492ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor                                              Type,
6493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
6494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
64959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              SubExpr.get(),
6496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
6497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
64981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
650060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6501454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
6502454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
6503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
65041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
650660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6507454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
6508454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
6509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
65101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
651260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
6514454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
6515454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
6516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
65171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
651960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6520454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
6521454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
6522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
65231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
652560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
6527454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
6528ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
6529ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  if (!Type)
6530ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor    return ExprError();
65311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
653260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
65336eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
6534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6535f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
65361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6538ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor      Type == E->getTypeInfoAsWritten() &&
6539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
65403fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
65411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6542ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(Type,
6543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
65449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr.get(),
6545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
6546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
65471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
654960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6550454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
6551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
655257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    TypeSourceInfo *TInfo
655357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor      = getDerived().TransformType(E->getTypeOperandSourceInfo());
655457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    if (!TInfo)
6555f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
65561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
655857fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor        TInfo == E->getTypeOperandSourceInfo())
65593fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
65601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
656157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getType(),
656257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             E->getLocStart(),
656357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             TInfo,
6564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
6565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
65661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
6568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
6569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
65701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
6571f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                      Sema::PotentiallyPotentiallyEvaluated);
65721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
657360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
6574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6575f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
65761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
65793fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
65801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
658157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getType(),
658257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                           E->getLocStart(),
65839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get(),
6584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
6585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
658860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
658901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetTreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
659001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (E->isTypeOperand()) {
659101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    TypeSourceInfo *TInfo
659201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      = getDerived().TransformType(E->getTypeOperandSourceInfo());
659301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    if (!TInfo)
659401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      return ExprError();
659501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
659601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    if (!getDerived().AlwaysRebuild() &&
659701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet        TInfo == E->getTypeOperandSourceInfo())
65983fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
659901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
660001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return getDerived().RebuildCXXTypeidExpr(E->getType(),
660101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                             E->getLocStart(),
660201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                             TInfo,
660301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                             E->getLocEnd());
660401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
660501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
660601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  // We don't know whether the expression is potentially evaluated until
660701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  // after we perform semantic analysis, so the expression is potentially
660801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  // potentially evaluated.
660901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
661001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
661101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
661201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (SubExpr.isInvalid())
661301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return ExprError();
661401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
661501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (!getDerived().AlwaysRebuild() &&
661601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      SubExpr.get() == E->getExprOperand())
66173fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
661801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
661901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  return getDerived().RebuildCXXUuidofExpr(E->getType(),
662001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                           E->getLocStart(),
662101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                           SubExpr.get(),
662201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet                                           E->getLocEnd());
662301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}
662401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
662501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichettemplate<typename Derived>
662601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois PichetExprResult
6627454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
66283fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
6629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
663260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
6634454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
66353fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
6636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
663960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6640454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
6641ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  DeclContext *DC = getSema().getFunctionLevelDeclContext();
6642ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC);
6643ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  QualType T = MD->getThisType(getSema().Context);
66441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6645ba48d6aad11a684d8557b25831764a61a37f65a2Douglas Gregor  if (!getDerived().AlwaysRebuild() && T == E->getType())
66463fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
66471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6648828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
6649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
665260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6653454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
665460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
6655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
6656f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
66571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
66603fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
6661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
66629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get());
6663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
666660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6667454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
66681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
66697c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
66707c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
6671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
6672f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
66731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
667453cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
6675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
66763fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
66771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6678036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
6679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
668260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6683ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr(
6684ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                                    CXXScalarValueInitExpr *E) {
6685ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
6686ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
6687f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6688ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
6689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6690ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo())
66913fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
66921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6693ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXScalarValueInitExpr(T,
6694ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          /*FIXME:*/T->getTypeLoc().getEndLoc(),
6695ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    E->getRParenLoc());
6696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
669960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6700454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
6701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
67021bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  TypeSourceInfo *AllocTypeInfo
67031bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor    = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
67041bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  if (!AllocTypeInfo)
6705f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
67061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
670860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
6709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
6710f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
67111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
6713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6714ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> PlacementArgs(SemaRef);
6715aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getPlacementArgs(),
6716aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  E->getNumPlacementArgs(), true,
6717aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  PlacementArgs, &ArgumentChanged))
6718aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
67191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
672043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
6721ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> ConstructorArgs(SemaRef);
6722aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (TransformExprs(E->getConstructorArgs(), E->getNumConstructorArgs(), true,
6723aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                     ConstructorArgs, &ArgumentChanged))
6724aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
67251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
67271af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
67281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
67291af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
67307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
67317c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
67321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
6733f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
67341af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
67351af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
67361af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
67371af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
67381af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
67397c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
67407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
67411af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
6742f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
67431af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
67441af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
67451af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
67461af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
67471af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
67487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
67497c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
67501af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
6751f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
67521af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
6753c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
67551bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor      AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
6756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
67571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
67581af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
67591af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
67601af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
67611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
67621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
67631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
67641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
67651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
67661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
67671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
67681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
67693fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
67701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
67711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67721bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  QualType AllocType = AllocTypeInfo->getType();
67735b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
67745b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
67755b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
67765b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
67775b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
67785b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
67795b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
67805b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
67815b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
67825b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
67835b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
6784c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      ArraySize
67859996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis        = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context,
67869996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               ConsArrayT->getSize(),
67879996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               SemaRef.Context.getSizeType(),
67889996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               /*FIXME:*/E->getLocStart()));
67895b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
67905b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
67915b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
67925b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
67933fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr());
67945b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
67955b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
67965b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
67975b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
67981bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor
6799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
6800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
6801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
6802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
6803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
68044bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                        E->getTypeIdParens(),
6805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
68061bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                        AllocTypeInfo,
68079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        ArraySize.get(),
6808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
6809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
68101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
6811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
68121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
681460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6815454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
681660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Operand = getDerived().TransformExpr(E->getArgument());
6817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
6818f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
68191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68201af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
68211af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
68221af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
68231af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
68247c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
68257c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
68261af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
6827f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
68281af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
6829c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
68311af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
68321af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
68331af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
68341af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
68351af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
68361af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
68375833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
68385833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    if (!E->getArgument()->isTypeDependent()) {
68395833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor      QualType Destroyed = SemaRef.Context.getBaseElementType(
68405833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor                                                         E->getDestroyedType());
68415833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor      if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
68425833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor        CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
68435833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor        SemaRef.MarkDeclarationReferenced(E->getLocStart(),
68445833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor                                          SemaRef.LookupDestructor(Record));
68455833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor      }
68465833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    }
68475833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
68483fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
68491af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
68501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
6852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
6853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
68549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Operand.get());
6855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
68561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
685860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
6860454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
686160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
6863f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
68641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6865b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  ParsedType ObjectTypePtr;
6866a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
68679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
6868a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
6869a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
6870a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
6871a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
6872a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
6873f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6874c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6875b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  QualType ObjectType = ObjectTypePtr.get();
6876f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
6877f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  if (QualifierLoc) {
6878f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor    QualifierLoc
6879f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
6880f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor    if (!QualifierLoc)
688143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      return ExprError();
688243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  }
6883f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  CXXScopeSpec SS;
6884f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  SS.Adopt(QualifierLoc);
68851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6886a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
6887a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
6888a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
688943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall      = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
6890b71d821d64af88749fc9860fd43a5164d8d819c8Douglas Gregor                                                ObjectType, 0, SS);
6891a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
6892f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6893a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
6894a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
6895a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
6896a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
6897a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
6898a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
6899a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
6900a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
6901b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
6902a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
6903a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
6904a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
6905a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
6906a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
6907a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
6908f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6909c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6910a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
6911a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
6912a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
6913a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
691426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
691526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
691626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
691743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo());
691826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
6919f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6920a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
6921c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
69229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
6923a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
6924a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
6925f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                                     SS,
692626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
692726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
6928fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
6929a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
6930a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
69311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6932a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
693360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6934ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
6935454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
6936f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
6937f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6938f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
6939f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
6940f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6941f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
6942f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
6943f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
69447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
69457c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
69467c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
69479f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
69489f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
69499f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
69509f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
69519f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
69529f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
6953f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
69549f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
6955f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6956f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
6957f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
6958f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
6959f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
6960f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
6961f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
6962f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
6963f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
6964f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6965f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
6966f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
6967f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6968f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
6969f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
6970f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
6971f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6972f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
6973f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
69744c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  if (Old->getQualifierLoc()) {
69754c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    NestedNameSpecifierLoc QualifierLoc
69764c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
69774c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    if (!QualifierLoc)
6978f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6979c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
69804c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    SS.Adopt(QualifierLoc);
6981c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  }
6982c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6983c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (Old->getNamingClass()) {
698466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    CXXRecordDecl *NamingClass
698566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
698666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                            Old->getNameLoc(),
698766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
698866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
6989f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6990c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
699166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
6992f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
6993f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6994f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
6995f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
6996f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
6997f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
6998f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
6999f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
7000f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
7001fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
7002fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              Old->getNumTemplateArgs(),
7003fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              TransArgs))
7004fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    return ExprError();
7005f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
7006f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
7007f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
7008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
70091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
701160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7012454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
70133d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
70143d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor  if (!T)
7015f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
70161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
70183d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor      T == E->getQueriedTypeSourceInfo())
70193fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
70201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
7022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
7023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
7024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
7025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
70261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
702860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
70296ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetTreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
70306ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo());
70316ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  if (!LhsT)
70326ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return ExprError();
70336ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
70346ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo());
70356ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  if (!RhsT)
70366ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return ExprError();
70376ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
70386ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  if (!getDerived().AlwaysRebuild() &&
70396ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet      LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo())
70406ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet    return SemaRef.Owned(E);
70416ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
70426ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  return getDerived().RebuildBinaryTypeTrait(E->getTrait(),
70436ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                            E->getLocStart(),
70446ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                            LhsT, RhsT,
70456ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet                                            E->getLocEnd());
70466ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet}
70476ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
70486ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichettemplate<typename Derived>
70496ad6f2848d7652ab2991286eb48be440d3493b28Francois PichetExprResult
7050865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
70512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               DependentScopeDeclRefExpr *E) {
705200cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  NestedNameSpecifierLoc QualifierLoc
705300cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
705400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  if (!QualifierLoc)
7055f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
70561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
705743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // TODO: If this is a conversion-function-id, verify that the
705843fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // destination type name (if present) resolves the same way after
705943fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // instantiation as it did in the local scope.
706043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
70612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
70622577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
70632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
7064f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
70651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7066f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
7067f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
706800cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor        QualifierLoc == E->getQualifierLoc() &&
70692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // Note: it is sufficient to compare the Name component of NameInfo:
70702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // if name has not changed, DNLoc has not changed either.
70712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getDeclName())
70723fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
70731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
707400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor    return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc,
70752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                         NameInfo,
7076f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
7077f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
7078d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
7079d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
7080fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7081fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              E->getNumTemplateArgs(),
7082fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              TransArgs))
7083fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    return ExprError();
7084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
708500cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc,
70862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
7087f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
7088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
7090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
709160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7092454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
7093321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
7094321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
7095321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
7096321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
7097321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
7098321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
7099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
7100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
7101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
7102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
7103f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
7104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
7105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
7106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
71077c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
71087c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
7109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
7110f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
71111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
7113ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
7114aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7115aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  &ArgumentChanged))
7116aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
7117aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
7118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
7119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
7120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
7121c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
71221af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
71231af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
7124c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
71253fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7126c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
71271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
71284411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
71294411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
71308c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              move_arg(Args),
71318c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              E->requiresZeroInitialization(),
7132428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                              E->getConstructionKind(),
7133428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth                                              E->getParenRange());
7134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
71351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
7137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
71385132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
71395132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
7140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
714160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7142454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
71435132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
7144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
71451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
71464765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// \brief Transform a C++ expression that contains cleanups that should
71474765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// be run after the expression is evaluated.
7148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
71494765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall/// Since ExprWithCleanups nodes are implicitly generated, we
71505132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
7151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
715260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
71534765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallTreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
71545132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
7155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
71561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
715860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
7160ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                                    CXXTemporaryObjectExpr *E) {
7161ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
7162ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
7163f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
71641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
7166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
7167c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                  getDerived().TransformDecl(E->getLocStart(),
71687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
7169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
7170f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
71711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
7173ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
7174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
7175aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7176aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                     &ArgumentChanged))
7177aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
71781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
7180ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo() &&
7181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
718291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
718391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
7184ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
71853fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.MaybeBindToTemporary(E);
718691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
7187ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
7188ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(T,
7189ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          /*FIXME:*/T->getTypeLoc().getEndLoc(),
7190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
7191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
7192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
71931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
719560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
7197454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
7198ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
7199ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
7200f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
72011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
7203ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
7204aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Args.reserve(E->arg_size());
7205aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
7206aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  &ArgumentChanged))
7207aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
7208aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
7209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
7210ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo() &&
7211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
72123fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
72131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
7215ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(T,
7216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
7217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
7218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
7219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
72201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
722260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7223865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
72242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                             CXXDependentScopeMemberExpr *E) {
7225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
722660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base((Expr*) 0);
7227aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
7228aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
7229aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
7230aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
7231aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
7232aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
7233aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
7234f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
72351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7236aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
7237b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ParsedType ObjectTy;
7238d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
72399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
7240aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
7241a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
7242d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
7243d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
7244aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
7245f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7246aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
7247b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ObjectType = ObjectTy.get();
7248aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
7249aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
7250aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
7251aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
7252aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
7253aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
72541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
72566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
7257c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
72586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
72597c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                            E->getFirstQualifierFoundInScope(),
72607c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                            E->getQualifierLoc().getBeginLoc());
72611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72627c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  NestedNameSpecifierLoc QualifierLoc;
7263a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
72647c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    QualifierLoc
72657c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor      = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
72667c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                     ObjectType,
72677c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                     FirstQualifierInScope);
72687c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor    if (!QualifierLoc)
7269f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7270a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
72711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
727243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // TODO: If this is a conversion-function-id, verify that the
727343fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // destination type name (if present) resolves the same way after
727443fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  // instantiation as it did in the local scope.
727543fed0de4f5bc189e45562491f83d5193eb8dac0John McCall
72762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
727743fed0de4f5bc189e45562491f83d5193eb8dac0John McCall    = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
72782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
7279f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
72801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7281aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
72823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
72833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
72843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
7285aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
7286aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
72877c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor        QualifierLoc == E->getQualifierLoc() &&
72882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getMember() &&
72893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
72903fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
72911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
7293aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
72943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
72953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
72967c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                       QualifierLoc,
7297129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
72982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
7299129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
73003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
73013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
7302d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
7303fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor  if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7304fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              E->getNumTemplateArgs(),
7305fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                              TransArgs))
7306fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    return ExprError();
73071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
7309aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
7310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
7311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
73127c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor                                                     QualifierLoc,
73133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
73142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                     NameInfo,
7315129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
7316129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
7317129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7318129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
731960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7320454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
7321129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
732260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base((Expr*) 0);
7323aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
7324aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
7325aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
7326aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
7327f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7328aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
7329aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
7330aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
7331aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
7332129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
73334c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  NestedNameSpecifierLoc QualifierLoc;
73344c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  if (Old->getQualifierLoc()) {
73354c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    QualifierLoc
73364c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
73374c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor    if (!QualifierLoc)
7338f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7339129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
7340129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
73412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  LookupResult R(SemaRef, Old->getMemberNameInfo(),
7342129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
7343129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7344129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
7345129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
7346129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
73477c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
73487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
73497c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
73509f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
73519f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
73529f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
73539f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
73549f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
73559f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
7356f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
73579f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
7358129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7359129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
7360129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
7361129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
7362129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
7363129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
7364129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
7365129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
7366129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
7367129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7368129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
7369129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
7370129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7371129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
7372129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
7373c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  // Determine the naming class.
7374042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth  if (Old->getNamingClass()) {
7375c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    CXXRecordDecl *NamingClass
7376c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
737766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                          Old->getMemberLoc(),
737866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
737966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
7380f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7381c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
738266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
7383c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
7384c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7385129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
7386129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
7387129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
7388129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
7389fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor    if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
7390fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                Old->getNumTemplateArgs(),
7391fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor                                                TransArgs))
7392fcc1253ba28d1d1debacd147be15e1684cc2eda5Douglas Gregor      return ExprError();
7393129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
7394c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
7395c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
7396c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
7397c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
7398c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
7399c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
7400c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
74019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
7402aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
7403129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
7404129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
74054c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor                                                  QualifierLoc,
7406c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
7407129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
7408129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
7409129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
7410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
7412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
741360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
74142e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlTreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
74152e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
74162e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  if (SubExpr.isInvalid())
74172e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl    return ExprError();
74182e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
74192e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
74203fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
74212e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
74222e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
74232e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl}
74242e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
74252e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redltemplate<typename Derived>
74262e156225a29407a50dd19041aa5750171ad44ea3Sebastian RedlExprResult
7427be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorTreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
74284f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
74294f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  if (Pattern.isInvalid())
74304f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor    return ExprError();
74314f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor
74324f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor  if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
74334f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor    return SemaRef.Owned(E);
74344f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor
743567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
743667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                           E->getNumExpansions());
7437be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}
7438ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7439ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregortemplate<typename Derived>
7440ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorExprResult
7441ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorTreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
7442ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // If E is not value-dependent, then nothing will change when we transform it.
7443ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // Note: This is an instantiation-centric view.
7444ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  if (!E->isValueDependent())
7445ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return SemaRef.Owned(E);
7446ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7447ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // Note: None of the implementations of TryExpandParameterPacks can ever
7448ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // produce a diagnostic when given only a single unexpanded parameter pack,
7449ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // so
7450ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
7451ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  bool ShouldExpand = false;
7452d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  bool RetainExpansion = false;
7453cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  llvm::Optional<unsigned> NumExpansions;
7454ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
7455ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                           &Unexpanded, 1,
7456d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                           ShouldExpand, RetainExpansion,
7457d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor                                           NumExpansions))
7458ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return ExprError();
7459ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7460d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  if (!ShouldExpand || RetainExpansion)
7461ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return SemaRef.Owned(E);
7462be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
7463ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // We now know the length of the parameter pack, so build a new expression
7464ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // that stores that length.
7465ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
7466ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                            E->getPackLoc(), E->getRParenLoc(),
7467cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                            *NumExpansions);
7468ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
7469ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
7470be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregortemplate<typename Derived>
7471be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorExprResult
7472c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorTreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
7473c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                          SubstNonTypeTemplateParmPackExpr *E) {
7474c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  // Default behavior is to do nothing with this transformation.
7475c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  return SemaRef.Owned(E);
7476c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}
7477c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
7478c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregortemplate<typename Derived>
7479c7793c73ba8a343de3f2552d984851985a46f159Douglas GregorExprResult
7480454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
74813fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
7482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
74841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
748560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7486454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
748781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *EncodedTypeInfo
748881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
748981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!EncodedTypeInfo)
7490f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
74911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
749381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
74943fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
7496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
749781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                            EncodedTypeInfo,
7498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
7499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
75001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
750260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7503454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
750492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Transform arguments.
750592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  bool ArgChanged = false;
7506ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
7507aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Args.reserve(E->getNumArgs());
7508aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
7509aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  &ArgChanged))
7510aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
7511aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor
751292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
751392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Class message: transform the receiver type.
751492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    TypeSourceInfo *ReceiverTypeInfo
751592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      = getDerived().TransformType(E->getClassReceiverTypeInfo());
751692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!ReceiverTypeInfo)
7517f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
7518c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
751992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If nothing changed, just retain the existing message send.
752092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
752192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
75223fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall      return SemaRef.Owned(E);
752392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
752492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Build a new class message send.
752592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
752692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getSelector(),
7527f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                               E->getSelectorLoc(),
752892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getMethodDecl(),
752992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getLeftLoc(),
753092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               move_arg(Args),
753192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getRightLoc());
753292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
753392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
753492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Instance message: transform the receiver
753592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
753692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor         "Only class and instance messages may be instantiated");
753760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Receiver
753892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    = getDerived().TransformExpr(E->getInstanceReceiver());
753992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (Receiver.isInvalid())
7540f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
754192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
754292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // If nothing changed, just retain the existing message send.
754392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
754492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
75453fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7546c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
754792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Build a new instance message send.
75489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCMessageExpr(Receiver.get(),
754992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getSelector(),
7550f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                             E->getSelectorLoc(),
755192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getMethodDecl(),
755292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getLeftLoc(),
755392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             move_arg(Args),
755492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getRightLoc());
7555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
75571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
755860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7559454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
75603fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
7561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
75631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
756460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7565454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
75663fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall  return SemaRef.Owned(E);
7567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
75691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
757060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7571454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
7572f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
757360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
7574f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
7575f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
7576f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor
7577f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // We don't need to transform the ivar; it will never change.
7578c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7579f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
7580f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
7581f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
75823fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7583c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
75849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
7585f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->getLocation(),
7586f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->isArrow(), E->isFreeIvar());
7587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
75891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
759060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7591454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
759212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  // 'super' and types never change. Property never changes. Just
759312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  // retain the existing expression.
759412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (!E->isObjectReceiver())
75953fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
75968ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian
7597e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // Transform the base expression.
759860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
7599e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (Base.isInvalid())
7600f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
7601c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7602e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // We don't need to transform the property; it will never change.
7603c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7604e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // If nothing changed, just retain the existing expression.
7605e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
7606e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      Base.get() == E->getBase())
76073fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
760912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (E->isExplicitProperty())
761012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
761112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                   E->getExplicitProperty(),
761212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                   E->getLocation());
761312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall
761412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
761512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                 E->getType(),
761612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                 E->getImplicitPropertyGetter(),
761712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                 E->getImplicitPropertySetter(),
761812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall                                                 E->getLocation());
7619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
76211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
762260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7623454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
7624f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
762560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
7626f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
7627f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
7628c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7629f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
7630f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
7631f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
76323fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7633c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
76349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
7635f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                         E->isArrow());
7636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
76381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
763960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7640454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
7641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
7642ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> SubExprs(SemaRef);
7643aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  SubExprs.reserve(E->getNumSubExprs());
7644aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
7645aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor                                  SubExprs, &ArgumentChanged))
7646aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor    return ExprError();
76471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
7649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
76503fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
76511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
7653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
7654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
7655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
76571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
765860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7659454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
7660c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  BlockDecl *oldBlock = E->getBlockDecl();
7661a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
7662c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0);
7663c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  BlockScopeInfo *blockScope = SemaRef.getCurBlock();
7664c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7665c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
7666c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  llvm::SmallVector<ParmVarDecl*, 4> params;
7667c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  llvm::SmallVector<QualType, 4> paramTypes;
7668a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
7669a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Parameter substitution.
7670c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
7671c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               oldBlock->param_begin(),
7672c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               oldBlock->param_size(),
7673c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               0, paramTypes, &params))
7674a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor    return true;
7675c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7676c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  const FunctionType *exprFunctionType = E->getFunctionType();
7677c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  QualType exprResultType = exprFunctionType->getResultType();
7678c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (!exprResultType.isNull()) {
7679c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    if (!exprResultType->isDependentType())
7680c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      blockScope->ReturnType = exprResultType;
7681c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    else if (exprResultType != getSema().Context.DependentTy)
7682c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      blockScope->ReturnType = getDerived().TransformType(exprResultType);
7683a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
7684a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
7685a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // If the return type has not been determined yet, leave it as a dependent
7686a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // type; it'll get set when we process the body.
7687c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (blockScope->ReturnType.isNull())
7688c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    blockScope->ReturnType = getSema().Context.DependentTy;
7689a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
7690a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // Don't allow returning a objc interface by value.
7691c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (blockScope->ReturnType->isObjCObjectType()) {
7692c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    getSema().Diag(E->getCaretLocation(),
7693a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor                   diag::err_object_cannot_be_passed_returned_by_value)
7694c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      << 0 << blockScope->ReturnType;
7695a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor    return ExprError();
7696a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  }
7697711c52bb20d0c69063b52a99826fb7d2835501f1John McCall
7698c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  QualType functionType = getDerived().RebuildFunctionProtoType(
7699c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                                        blockScope->ReturnType,
7700c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                                        paramTypes.data(),
7701c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                                        paramTypes.size(),
7702c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                                        oldBlock->isVariadic(),
7703c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                                        0, RQ_None,
7704c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               exprFunctionType->getExtInfo());
7705c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  blockScope->FunctionType = functionType;
7706711c52bb20d0c69063b52a99826fb7d2835501f1John McCall
7707711c52bb20d0c69063b52a99826fb7d2835501f1John McCall  // Set the parameters on the block decl.
7708c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (!params.empty())
7709c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    blockScope->TheDecl->setParams(params.data(), params.size());
7710a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
7711a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // If the return type wasn't explicitly set, it will have been marked as a
7712a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // dependent type (DependentTy); clear out the return type setting so
7713a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // we will deduce the return type when type-checking the block's body.
7714c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (blockScope->ReturnType == getSema().Context.DependentTy)
7715c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    blockScope->ReturnType = QualType();
7716a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
7717711c52bb20d0c69063b52a99826fb7d2835501f1John McCall  // Transform the body
7718c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  StmtResult body = getDerived().TransformStmt(E->getBody());
7719c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (body.isInvalid())
7720711c52bb20d0c69063b52a99826fb7d2835501f1John McCall    return ExprError();
7721711c52bb20d0c69063b52a99826fb7d2835501f1John McCall
7722c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#ifndef NDEBUG
7723c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  // In builds with assertions, make sure that we captured everything we
7724c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  // captured before.
7725c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7726c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  if (oldBlock->capturesCXXThis()) assert(blockScope->CapturesCXXThis);
7727c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7728c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  for (BlockDecl::capture_iterator i = oldBlock->capture_begin(),
7729c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall         e = oldBlock->capture_end(); i != e; ++i) {
77306b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    VarDecl *oldCapture = i->getVariable();
7731c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7732c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    // Ignore parameter packs.
7733c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    if (isa<ParmVarDecl>(oldCapture) &&
7734c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall        cast<ParmVarDecl>(oldCapture)->isParameterPack())
7735c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      continue;
7736c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7737c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall    VarDecl *newCapture =
7738c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall      cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
7739c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                               oldCapture));
77406b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    assert(blockScope->CaptureMap.count(newCapture));
7741c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  }
7742c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall#endif
7743c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall
7744c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall  return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
7745c6ac9c3d754f91d27b1734965e5f1a8e542e8f40John McCall                                    /*Scope=*/0);
7746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
77481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
774960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
7750454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
7751a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  ValueDecl *ND
7752a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
7753a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                       E->getDecl()));
7754a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!ND)
7755f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
77562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
7757a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!getDerived().AlwaysRebuild() &&
7758a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      ND == E->getDecl()) {
7759a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // Mark it referenced in the new context regardless.
7760a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // FIXME: this is a bit instantiation-specific.
7761a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
7762a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
77633fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall    return SemaRef.Owned(E);
7764a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
7765a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
77662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation());
776740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  return getDerived().RebuildDeclRefExpr(NestedNameSpecifierLoc(),
77682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, 0);
7769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
77701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
7772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
7773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
7774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
77751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
777685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
777785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
77782865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildPointerType(PointeeType, Star,
7779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
7780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
77821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
778385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
778485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
77852865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Star,
7786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
7787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
77891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
77901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
779185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
779285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
779385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
77942865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
779585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
7796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
7797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
77981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
77991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
780085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
780185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
780285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
78032865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
780485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
7805577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7807577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
78081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
7809577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
7810577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
7811577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
7812577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
7813577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
7814577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
7815577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
7816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
7817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
7818577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
78191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
78211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
78221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
78231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
7824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
7825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
7826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
7827577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
7828577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
7829577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
7830577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
7831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
78321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78339996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  IntegerLiteral ArraySize(SemaRef.Context, *Size, SizeType,
78349996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                           /*FIXME*/BracketsRange.getBegin());
78351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
7836577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
78371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
7838577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
78391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7840577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
78411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
78421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
7843577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
7844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
784585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
784685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
78471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
784885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
7849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7851577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
78521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
78531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
7854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
785585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
785685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
78571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
785885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
7859577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
78601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
78621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
78631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
7864577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
78659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SizeExpr,
7866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
7867577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
78681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
78699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
7870577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
7871577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7872577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7873577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
78741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
78751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
7876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
78779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Expr *SizeExpr,
7878577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
7879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
78801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
78819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
7882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
7883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
7887e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                               unsigned NumElements,
7888e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson                                               VectorType::VectorKind VecKind) {
7889577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
7890e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson  return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
7891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
78921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7893577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
7895577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
7896577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
7897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
7898577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
7899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
79009996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
79019996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                             AttributeLoc);
79029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
7903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
79041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
79061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
79071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
79089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                           Expr *SizeExpr,
7909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
79109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
7911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
79121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7914577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
79151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
7916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
79171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
7918fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                          unsigned Quals,
7919c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                                  RefQualifierKind RefQualifier,
7920fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                            const FunctionType::ExtInfo &Info) {
79211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
7922c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                                   Quals, RefQualifier,
7923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
7924fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   getDerived().getBaseEntity(),
7925fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   Info);
7926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
79271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7928577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7929a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
7930a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
7931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
7932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
7933a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
7934ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
7935ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
7936ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
7937ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
793892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // FIXME: Doesn't account for ObjCInterfaceDecl!
7939ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
7940ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
7941ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
7942ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
7943ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
7944ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
7945ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
7946ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
7947ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
7948c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
7949ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
7950ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
7951ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
7952ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
7953ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
7954ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
7955ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
7956ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
7957ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
7958ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
79592a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
79602a984cad5ac3fdceeff2bd99daa7b90979313475John McCall                                                       SourceLocation Loc) {
79612a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  return SemaRef.BuildTypeofExprType(E, Loc);
7962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
7966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
7967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
79702a984cad5ac3fdceeff2bd99daa7b90979313475John McCallQualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
79712a984cad5ac3fdceeff2bd99daa7b90979313475John McCall                                                     SourceLocation Loc) {
79722a984cad5ac3fdceeff2bd99daa7b90979313475John McCall  return SemaRef.BuildDecltypeType(E, Loc);
7973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
7974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
7975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
7976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
7977833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
7978833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
7979d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
7980d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
7981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
79821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7983dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
7984dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
7985dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
7986dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
7987a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
7988c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
7989d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
7990dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
7991dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
7992c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  SS.MakeTrivial(SemaRef.Context, Prefix, Range);
79932e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor  if (SemaRef.BuildCXXNestedNameSpecifier(0, II, /*FIXME:*/Range.getBegin(),
79942e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                                          /*FIXME:*/Range.getEnd(),
79952e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                                          ObjectType, false,
79962e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                                          SS, FirstQualifierInScope,
79972e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                                          false))
79982e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor    return 0;
79992e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor
80002e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor  return SS.getScopeRep();
8001dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
8002dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
8003dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
8004dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
8005dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
8006dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
8007dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
8008dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
8009dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
8010dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
8011dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
8012dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
8013dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
8014dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
801514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                   NamespaceAliasDecl *Alias) {
801614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, Alias);
801714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
801814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
801914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregortemplate<typename Derived>
802014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNestedNameSpecifier *
802114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
802214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                   SourceRange Range,
8023dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
8024edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   QualType T) {
8025edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor  if (T->isDependentType() || T->isRecordType() ||
8026dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
8027a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
8028dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
8029dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
8030dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
80311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8032dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
8033dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
8034dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
80351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8036d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
80371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
8038fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
8039d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
8040d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
8041fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
8042d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
8043d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
8044d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
8045d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
80461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
8047fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
8048fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            const IdentifierInfo &Name,
8049fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            SourceLocation NameLoc,
805043fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                            QualType ObjectType,
805143fed0de4f5bc189e45562491f83d5193eb8dac0John McCall                                            NamedDecl *FirstQualifierInScope) {
8052fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  UnqualifiedId TemplateName;
8053fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  TemplateName.setIdentifier(&Name, NameLoc);
8054d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
8055d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
8056fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                       /*FIXME:*/SourceLocation(),
8057d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
8058fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                       TemplateName,
8059b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                       ParsedType::make(ObjectType),
8060d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
8061d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
806243fed0de4f5bc189e45562491f83d5193eb8dac0John McCall  return Template.get();
8063d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
80641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
8066ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
8067fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas GregorTreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
8068ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
8069fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                            SourceLocation NameLoc,
8070ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
8071ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
8072fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  // FIXME: Bogus location information.
8073fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
8074fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor  Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
8075d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
8076d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
8077fd4ffebd8e8e77346e70dfbc2d72dd673ebd7c6dDouglas Gregor                                       /*FIXME:*/SourceLocation(),
8078d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
8079d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
8080b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                       ParsedType::make(ObjectType),
8081d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
8082d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
8083d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
8084ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
8085c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8086ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
808760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
8088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
8089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
80909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *OrigCallee,
80919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *First,
80929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *Second) {
80939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Callee = OrigCallee->IgnoreParenCasts();
80949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
80951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
8097f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
80989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
80999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType())
81009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinArraySubscriptExpr(First,
81019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Callee->getLocStart(),
81029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Second, OpLoc);
81031a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
81041a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
81059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc);
81069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  } else if (Second == 0 || isPostIncDec) {
81079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType()) {
8108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
8109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
81102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      UnaryOperatorKind Opc
8111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
81121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
8114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
8115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
81169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
81179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType()) {
8118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
8119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
81202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
812160d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Result
81229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
8123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
8124f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
81251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
8127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
8128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
81291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
8131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
81326e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
81331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
8135ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
8136ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
8137ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
8138ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
81396e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
8140ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
81419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl());
8142ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
81431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
81459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Args[2] = { First, Second };
81469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  unsigned NumArgs = 1 + (Second != 0);
81471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
8149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
81502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    UnaryOperatorKind Opc
8151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
81529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
8153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
81541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8155f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
81569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(),
8157ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
81589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      First,
81599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Second);
8160f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
8161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
81622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
816360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Result
8164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
8165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
8166f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
81671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
81681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
8169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
81701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
817126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
817260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
81739ae2f076ca5ab1feb3ba95629099ec2319833701John McCallTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
817426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
817526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
8176f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor                                                       CXXScopeSpec &SS,
817726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
817826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
8179fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
8180a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
81819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType BaseType = Base->getType();
81829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
818326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
8184c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      (isArrow && BaseType->getAs<PointerType>() &&
8185bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
8186bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
818726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
81889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
818926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
8190fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
8191a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
819226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
819326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
81942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
8195a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
81962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
81972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                 SemaRef.Context.getCanonicalType(DestroyedType->getType())));
81982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
81992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  NameInfo.setNamedTypeInfo(DestroyedType);
82002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
820126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
82022577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
82039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getSema().BuildMemberReferenceExpr(Base, BaseType,
820426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
820526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
82062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            NameInfo,
820726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
820826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
820926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
8210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
8211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
8212577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
8213