TreeTransform.h revision 9ae2f076ca5ab1feb3ba95629099ec2319833701
1a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall//===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===/
2577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
3577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//                     The LLVM Compiler Infrastructure
4577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
5577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file is distributed under the University of Illinois Open Source
6577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// License. See LICENSE.TXT for details.
7577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
8577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
9577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  This file implements a semantic tree transformation that takes a given
10577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  AST and rebuilds it, possibly transforming some nodes in the process.
11577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
12577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
13577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H
15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
16e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Sema.h"
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h"
18dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
19c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
20657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
22b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
26a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h"
2719510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Ownership.h"
2819510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h"
29b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
30a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h"
31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
64670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
7143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningStmtResult OwningStmtResult;
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningExprResult OwningExprResult;
94b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
9543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  typedef Sema::MultiStmtArg MultiStmtArg;
96c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
97577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  static inline OwningExprResult Owned(Expr *E) { return E; }
1099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  static inline OwningStmtResult Owned(Stmt *S) { return S; }
1109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, returns no source-location information. Subclasses can
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
1291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
1431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  DeclarationName Entity) : Self(Self) {
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determine whether the given type \p T has already been
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// to short-circuit evaluation when it is known that a given type will
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// \brief Determine whether the given call argument should be dropped, e.g.,
1766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// because it is a default argument.
1776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  ///
1786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// Subclasses can provide an alternative implementation of this routine to
1796eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// determine which kinds of call arguments get dropped. By default,
1806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// CXXDefaultArgument nodes are dropped (prior to transformation).
1816eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  bool DropCallArgument(Expr *E) {
1826eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    return E->isDefaultArgument();
1836eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  }
184c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by creating a
188a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// TypeSourceInfo for it and delegating to the appropriate
189a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// function.  This is expensive, but we don't mind, because
190a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// this method is deprecated anyway;  all users should be
191a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// switched to storing TypeSourceInfos.
192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
194124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType TransformType(QualType T, QualType ObjectType = QualType());
1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transforms the given type-with-location into a new
197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type-with-location.
198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ///
199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by delegating to the
200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// appropriate TransformXXXType to build a new type.  Subclasses
201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// may override this function (to take over all type
202a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// transformations) or some set of the TransformXXXType functions
203a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// to alter the transformation.
204c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  TypeSourceInfo *TransformType(TypeSourceInfo *DI,
205124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                QualType ObjectType = QualType());
206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
208a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
209a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
211c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL,
212124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                         QualType ObjectType = QualType());
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
214657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
21743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
21843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
21943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
22043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
22143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
22243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
225657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
226657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
233454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult TransformExpr(Expr *E);
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
238dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
239dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
2407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
24243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
24543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
246c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
247c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().TransformDecl(Loc, D);
2487c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  }
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
2516cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
253c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// This specific declaration transformation only applies to the first
2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2576cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
2586cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
259c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
260c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
2616cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
262c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
266dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
267dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
269a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
270c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
271c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
27681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
27781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
27881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
2792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo
2802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
2812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               QualType ObjectType = QualType());
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
285d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
287d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
295670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
296670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
306a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// \brief Fakes up a TypeSourceInfo for a type.
307a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
308a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return SemaRef.Context.getTrivialTypeSourceInfo(T,
309833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
310833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
313a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
314124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T, \
315124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType = QualType());
316a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms the parameters of a function type into the
31921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// given vectors.
32021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// The result vectors should be kept in sync; null entries in the
32221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// variables vector are acceptable.
32321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// Return true on error.
32521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
32621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<QualType> &PTypes,
32721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<ParmVarDecl*> &PVars);
32821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
32921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms a single function-type parameter.  Return null
33021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// on error.
33121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm);
33221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
333c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL,
334124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType);
33585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
336c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType
337dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
338dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
34043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
341d8383d45e41ba2316610e5d638d2872e37b67cfbZhongxing Xu  OwningExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
34443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
346454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult Transform##Node(Node *E);
3477381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
3484bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
35485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
36085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
36585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
37085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
37185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
37285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
37985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
38085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
40485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
40585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
41485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
41585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
4249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SizeExpr,
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *SizeExpr,
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
44482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
445788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    VectorType::AltiVecSpecific AltiVecSpec);
4461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
4619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *SizeExpr,
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
471fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    bool Variadic, unsigned Quals,
472fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    const FunctionType::ExtInfo &Info);
4731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
476a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
477ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// \brief Rebuild an unresolved typename type, given the decl that
478ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// the UnresolvedUsingTypenameDecl was transformed to.
479ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType RebuildUnresolvedUsingType(Decl *D);
480ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4957da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
5009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType RebuildTypeOfExprType(Expr *Underlying);
501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
5119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType RebuildDecltypeType(Expr *Underlying);
5121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
519833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
520d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &Args);
5211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
524465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// By default, builds a new ElaboratedType type from the keyword,
525465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// the nested-name-specifier and the named type.
526465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// Subclasses may override this routine to provide different behavior.
527465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  QualType RebuildElaboratedType(ElaboratedTypeKeyword Keyword,
528465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                 NestedNameSpecifier *NNS, QualType Named) {
529465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, NNS, Named);
5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
534e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// By default, builds a new DependentNameType type from the
535e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// nested-name-specifier and the given type. Subclasses may override
536e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// this routine to provide different behavior.
53733500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType RebuildDependentTemplateSpecializationType(
53833500955d731c73717af52088b7fc0e7a85681e7John McCall                                    ElaboratedTypeKeyword Keyword,
53933500955d731c73717af52088b7fc0e7a85681e7John McCall                                    NestedNameSpecifier *NNS,
54033500955d731c73717af52088b7fc0e7a85681e7John McCall                                    const IdentifierInfo *Name,
54133500955d731c73717af52088b7fc0e7a85681e7John McCall                                    SourceLocation NameLoc,
54233500955d731c73717af52088b7fc0e7a85681e7John McCall                                    const TemplateArgumentListInfo &Args) {
54333500955d731c73717af52088b7fc0e7a85681e7John McCall    // Rebuild the template name.
54433500955d731c73717af52088b7fc0e7a85681e7John McCall    // TODO: avoid TemplateName abstraction
54533500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateName InstName =
54633500955d731c73717af52088b7fc0e7a85681e7John McCall      getDerived().RebuildTemplateName(NNS, *Name, QualType());
54733500955d731c73717af52088b7fc0e7a85681e7John McCall
54896fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor    if (InstName.isNull())
54996fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor      return QualType();
55096fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor
55133500955d731c73717af52088b7fc0e7a85681e7John McCall    // If it's still dependent, make a dependent specialization.
55233500955d731c73717af52088b7fc0e7a85681e7John McCall    if (InstName.getAsDependentTemplateName())
55333500955d731c73717af52088b7fc0e7a85681e7John McCall      return SemaRef.Context.getDependentTemplateSpecializationType(
55433500955d731c73717af52088b7fc0e7a85681e7John McCall                                          Keyword, NNS, Name, Args);
55533500955d731c73717af52088b7fc0e7a85681e7John McCall
55633500955d731c73717af52088b7fc0e7a85681e7John McCall    // Otherwise, make an elaborated type wrapping a non-dependent
55733500955d731c73717af52088b7fc0e7a85681e7John McCall    // specialization.
55833500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType T =
55933500955d731c73717af52088b7fc0e7a85681e7John McCall      getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
56033500955d731c73717af52088b7fc0e7a85681e7John McCall    if (T.isNull()) return QualType();
561465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
56222f638a58ed05579c51ee6a35a1d16a7c2157f90Abramo Bagnara    // NOTE: NNS is already recorded in template specialization type T.
56322f638a58ed05579c51ee6a35a1d16a7c2157f90Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, /*NNS=*/0, T);
5641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
569e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// (or elaborated type). Subclasses may override this routine to provide
570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
571e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
5724a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    NestedNameSpecifier *NNS,
5734a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    const IdentifierInfo *Id,
574e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation KeywordLoc,
575e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceRange NNSRange,
576e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation IdLoc) {
5774033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    CXXScopeSpec SS;
5784033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SS.setScopeRep(NNS);
579e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    SS.setRange(NNSRange);
580e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara
5814033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (NNS->isDependent()) {
5824033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      // If the name is still dependent, just build a new dependent name type.
5834033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
5844033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return SemaRef.Context.getDependentNameType(Keyword, NNS, Id);
5854033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
5864033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
587465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (Keyword == ETK_None || Keyword == ETK_Typename)
588e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return SemaRef.CheckTypenameType(Keyword, NNS, *Id,
589e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                       KeywordLoc, NNSRange, IdLoc);
590465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
591465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
592465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
593e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    // We had a dependent elaborated-type-specifier that has been transformed
5944033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // into a non-dependent elaborated-type-specifier. Find the tag we're
5954033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // referring to.
596e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
5974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
5984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!DC)
5994033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6004033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6015613876991c80a684595fe8de1f039296a0657ffJohn McCall    if (SemaRef.RequireCompleteDeclContext(SS, DC))
6025613876991c80a684595fe8de1f039296a0657ffJohn McCall      return QualType();
6035613876991c80a684595fe8de1f039296a0657ffJohn McCall
6044033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    TagDecl *Tag = 0;
6054033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SemaRef.LookupQualifiedName(Result, DC);
6064033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    switch (Result.getResultKind()) {
6074033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFound:
6084033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFoundInCurrentInstantiation:
6094033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
610c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6114033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Found:
6124033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        Tag = Result.getAsSingle<TagDecl>();
6134033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
614c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6154033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundOverloaded:
6164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundUnresolvedValue:
6174033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        llvm_unreachable("Tag lookup cannot find non-tags");
6184033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
619c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6204033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Ambiguous:
6214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        // Let the LookupResult structure handle ambiguities.
6224033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
6234033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6244033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6254033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!Tag) {
6261eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor      // FIXME: Would be nice to highlight just the source range.
627e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
6281eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor        << Kind << Id << DC;
6294033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6304033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
631465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
632e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) {
633e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
6344033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
6354033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6364033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6374033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6384033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // Build the elaborated-type-specifier type.
6394033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    QualType T = SemaRef.Context.getTypeDeclType(Tag);
640465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
641dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
6421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
643dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
644dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
645dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
646dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
647dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
648dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
649dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
650dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
651a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
652c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
653c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
654dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
655dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
656dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
657dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
658dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
659dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
660dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
661dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
662dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
663dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
664dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
665dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
666dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
667dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
668dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
669dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
670dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
671dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
672dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
673dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
674edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  QualType T);
675d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
676d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
677d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
678d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
679d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
680d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
681d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
682d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
683d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
684d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
685d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
686d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
687d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
688d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
689d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
690d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
691d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
692d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
693d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
6943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
6953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
697ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
698ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
699ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
700ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
701ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
702ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
703ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
704ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
705ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
706ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
707c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
7169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
7259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *LHS,
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
7279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *RHS,
72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
7299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningStmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
7389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().ActOnCaseStmtBody(S, Body);
7399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return S;
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
7489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      Stmt *SubStmt) {
7499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
7609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Stmt *SubStmt) {
7619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, SubStmt);
76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
768eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
7699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 VarDecl *CondVar, Stmt *Then,
7709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 SourceLocation ElseLoc, Stmt *Else) {
7719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
77743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
778586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
7799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *Cond, VarDecl *CondVar) {
7809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
781d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                            CondVar);
78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
78743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
7899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Stmt *Switch, Stmt *Body) {
7909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
79643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
79743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
798eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                    Sema::FullExprArg Cond,
79999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
8009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Stmt *Body) {
8019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
80643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
8089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
80943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
8119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 Expr *Cond,
81243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
8139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
8149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 Cond, RParenLoc);
81543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
81643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
81743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
81843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
81943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
82043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
8211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
82243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
8239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Stmt *Init, Sema::FullExprArg Cond,
82499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
8259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  SourceLocation RParenLoc, Stmt *Body) {
8269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
827d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                  CondVar,
8289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Inc, RParenLoc, Body);
82943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
83243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
83343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
83443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
83643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
83743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
83943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
84043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
84143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
84243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
84343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
84443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
84543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
84643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
8479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *Target) {
8489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
84943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
85243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
85343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
85443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
85543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
8569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *Result) {
8571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnReturnStmt(ReturnLoc, Result);
85943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
86243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
86343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
86443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
86543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
8661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
86743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
86843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
86943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
87043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
87143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
87243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
87343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
875703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
876703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
877703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
879703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc,
880703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
882703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
883703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
884ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
885703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
886703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
8879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Expr *AsmString,
888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
889703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
890703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
891c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
892703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
8939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Exprs, AsmString, Clobbers,
894703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
895703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
8964dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
8974dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @try statement.
8984dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
8994dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9004dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9014dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
9029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *TryBody,
9038f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                        MultiStmtArg CatchStmts,
9049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *Finally) {
9059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts),
9069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Finally);
9074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
9084dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
909be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Rebuild an Objective-C exception declaration.
910be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
911be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new declaration.
912be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
913be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
914be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                    TypeSourceInfo *TInfo, QualType T) {
915c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildObjCExceptionDecl(TInfo, T,
916c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                            ExceptionDecl->getIdentifier(),
917be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                            ExceptionDecl->getLocation());
918be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
919c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
920be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Build a new Objective-C @catch statement.
921be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
922be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
923be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
924be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  OwningStmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
925be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          SourceLocation RParenLoc,
926be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          VarDecl *Var,
9279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Stmt *Body) {
928be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
9299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Var, Body);
930be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
931c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @finally statement.
9334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
9344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9354dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9364dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
9379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Stmt *Body) {
9389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
9394dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
940c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9418fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @throw statement.
942d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  ///
943d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
944d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
945d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  OwningStmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
9469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *Operand) {
9479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
948d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
949c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9508fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @synchronized statement.
9518fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  ///
9528fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
9538fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9548fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningStmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
9559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *Object,
9569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Stmt *Body) {
9579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object,
9589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Body);
9598fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  }
960c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor
961c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// \brief Build a new Objective-C fast enumeration statement.
962c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  ///
963c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
964c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
965c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
966c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation LParenLoc,
9679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Stmt *Element,
9689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Expr *Collection,
969c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                SourceLocation RParenLoc,
9709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Stmt *Body) {
971c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
9729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Element,
9739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Collection,
974c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                RParenLoc,
9759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Body);
976c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  }
977c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
97843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
97943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
98043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
98143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
983a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
98443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
98543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
98643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
9871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
98843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
98943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
99043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
99143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
99243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
99343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
99443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
99543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
99643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
9979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       Stmt *Handler) {
9989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
9999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Handler));
100043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
100343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
100443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
100543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
100643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
10079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Stmt *TryBlock,
100843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
10099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers));
101043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1016f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1017f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              LookupResult &R,
1018f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                              bool RequiresADL) {
1019f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1020f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
1021f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1022f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1023f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
1024f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
1025f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
1026f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
1027a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
1028a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                      SourceRange QualifierRange,
10292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                      ValueDecl *VD,
10302577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                      const DeclarationNameInfo &NameInfo,
1031dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                      TemplateArgumentListInfo *TemplateArgs) {
1032a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
1033a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
1034a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
1035dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
1036dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
10372577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
10382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
10479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1050a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
10511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1052a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1053a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1055a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
1056a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
1057a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                NestedNameSpecifier *Qualifier,
105826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceRange QualifierRange,
105926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  TypeSourceInfo *ScopeType,
106026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceLocation CCLoc,
1061fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                  SourceLocation TildeLoc,
1062a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
10631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
10651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
10709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *SubExpr) {
10719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr);
1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Build a new builtin offsetof expression.
10758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ///
10768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
10778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
10788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OwningExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
10798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       TypeSourceInfo *Type,
10808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       Action::OffsetOfComponent *Components,
10818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       unsigned NumComponents,
10828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       SourceLocation RParenLoc) {
10838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
10848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          NumComponents, RParenLoc);
10858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1086c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
10881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1091a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  OwningExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
10925ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
1094a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
10991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildSizeOfAlignOf(Expr *SubExpr, SourceLocation OpLoc,
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
11059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      = getSema().CreateSizeOfAlignOfExpr(SubExpr, OpLoc, isSizeOf, R);
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
11081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
11131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildArraySubscriptExpr(Expr *LHS,
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
11189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *RHS,
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
11209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS,
11219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             LBracketLoc, RHS,
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
11339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc,
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
11421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
114383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
114483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
11452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                     const DeclarationNameInfo &MemberNameInfo,
1146f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                                     ValueDecl *Member,
11476bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                     NamedDecl *FoundDecl,
1148d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
11498a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
1150d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
1151d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
1152d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
11531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      if (getSema().PerformObjectMemberConversion(Base, Qualifier,
11556bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                                  FoundDecl, Member))
115683a56c4a1d5bbf7e4b6b08b105051575a2421d34Douglas Gregor        return getSema().ExprError();
11578aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
11581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
11599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        new (getSema().Context) MemberExpr(Base, isArrow,
11602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                           Member, MemberNameInfo,
1161d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
1162d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
1163d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
116683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
116783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
116883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
116983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
117083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
11719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().DefaultFunctionArrayConversion(Base);
11729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    QualType BaseType = Base->getType();
1173aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
11746bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // FIXME: this involves duplicating earlier analysis in a lot of
11756bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // cases; we should avoid this when possible.
11762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
11776bb8017bb9e828d118e15e59d71c66bba323c364John McCall    R.addDecl(FoundDecl);
1178c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1179c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
11809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1181129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1182c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
11861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
11919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *LHS, Expr *RHS) {
11929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS);
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
11961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
11999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildConditionalOperator(Expr *Cond,
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
12019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *LHS,
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
12039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *RHS) {
12049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
12059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        LHS, RHS);
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
12091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12129d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  OwningExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
12139d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
12159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *SubExpr) {
1216b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
12179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubExpr);
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
12211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
122542f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
12279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Init) {
122842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
12299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Init);
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildExtVectorElementExpr(Expr *Base,
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1240aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1241129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
12422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
12439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1244129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1245129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
12462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                              NameInfo,
1247129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
12511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1256e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1257e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
1258e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    OwningExprResult Result
1259e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1260e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1261e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1262c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1263e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1264e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1265e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1266e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1267e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
12711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
12789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *Init) {
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
12819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Init);
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
12841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
12901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
12991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13022cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
13039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SubExpr, TypeSourceInfo *TInfo,
13042cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    SourceLocation RParenLoc) {
13052cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara    return getSema().BuildVAArgExpr(BuiltinLoc,
13069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    SubExpr, TInfo,
13072cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    RParenLoc);
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
13111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1317c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1318f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
13231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
13331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
13379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Stmt *SubStmt,
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
13399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
13473fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TypeSourceInfo *TInfo1,
13483fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TypeSourceInfo *TInfo2,
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
13503fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara    return getSema().BuildTypesCompatibleExpr(BuiltinLoc,
13513fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TInfo1, TInfo2,
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
13609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *Cond, Expr *LHS, Expr *RHS,
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
13639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Cond, LHS, RHS,
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
13721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
13779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Callee,
13789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *First,
13799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Second);
13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
13851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
13909d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
13939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
13979d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
13981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
13999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
14029d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
14031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
14049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    SubExpr, RParenLoc);
14051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
14079d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
14081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
14099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                        SubExpr,
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
14111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
14139d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
14141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
14159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
14161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
14211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
14319d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
14349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Expr *SubExpr,
1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1436c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
14379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1438c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1439c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
14489d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
14519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *SubExpr,
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1453c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
14549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1455c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1456c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
14659d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
14689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SubExpr,
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1470c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
14719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1472c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1473c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
14829d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
14859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1487c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
14889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1489c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1490c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
14989d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                TypeSourceInfo *TInfo,
1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
15009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Expr *Sub,
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
15039d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                               TInfo->getType().getAsOpaquePtr(),
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
150588650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
15061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
151457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
151557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
151657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        TypeSourceInfo *Operand,
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1518c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
151957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
1520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
152657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
152757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
15289ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand,
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
15309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
153157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
15321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
15331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
15371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
15391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1540828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1541828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1543828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1544828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub) {
15529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXThrow(ThrowLoc, Sub);
1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1560c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  OwningExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1561036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1562036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1563036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1570ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  OwningExprResult RebuildCXXScalarValueInitExpr(SourceLocation TypeStartLoc,
1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
15741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
15751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
15761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
15894bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                     SourceRange TypeIdParens,
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
15939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *ArraySize,
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
15971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
16014bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                 TypeIdParens,
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
16059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 ArraySize,
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
16189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand) {
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
16209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Operand);
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
16321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
16361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1641865d447ac6a4721ab58e898d014a21f2eff74b06John McCall  OwningExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
16432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                       const DeclarationNameInfo &NameInfo,
1644f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1648f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1649f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
16502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo,
1651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1652f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
16532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo);
1654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1660f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OwningExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1661f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1662f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1663d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1664f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
16724411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
16758c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           MultiExprArg Args,
16768c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           bool RequiresZeroInit,
16778c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                             CXXConstructExpr::ConstructionKind ConstructKind) {
1678ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> ConvertedArgs(SemaRef);
1679c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
16804411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
16814411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor      return getSema().ExprError();
1682c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
16834411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
16848c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           move_arg(ConvertedArgs),
16858c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           RequiresZeroInit, ConstructKind);
1686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
17299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
1730aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1733a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1734a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1735129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
17362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                   const DeclarationNameInfo &MemberNameInfo,
1737129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1739a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1740a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
17411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
1743aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1744129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
17452577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            MemberNameInfo,
17462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            TemplateArgs);
1747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1749129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
17503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
17513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
17523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
17539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildUnresolvedMemberExpr(Expr *BaseE,
1754aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1755129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1756129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1757129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1758129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1759c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1760129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1761129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
17623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
17633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
17643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
17651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
1767aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1768c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1769c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
17703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
17711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
177781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                         TypeSourceInfo *EncodeTypeInfo,
1778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
177981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
1780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
17811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
178392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C class message.
178492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
178592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
178692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1787c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
178892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
178992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
179092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
179192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     ReceiverTypeInfo->getType(),
179292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     /*SuperLoc=*/SourceLocation(),
1793f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                     Sel, Method, LBracLoc, RBracLoc,
179492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     move(Args));
179592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
179692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
179792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C instance message.
17989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildObjCMessageExpr(Expr *Receiver,
179992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
180092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1801c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
180292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
180392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
18049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildInstanceMessage(Receiver,
18059ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Receiver->getType(),
180692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        /*SuperLoc=*/SourceLocation(),
1807f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                        Sel, Method, LBracLoc, RBracLoc,
180892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        move(Args));
180992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
181092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
1811f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C ivar reference expression.
1812f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1813f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1814f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
18159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
1816f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          SourceLocation IvarLoc,
1817f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          bool IsArrow, bool IsFreeIvar) {
1818f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    // FIXME: We lose track of the IsFreeIvar bit.
1819f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
18209ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1821f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
1822f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
1823f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1824f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IvarLoc,
1825d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0,
1826ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
1827f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1828f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1829c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1830f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1831f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1832c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
18339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1834c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IvarLoc, IsArrow, SS,
1835f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1836c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1837f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1838f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1839e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor
1840e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// \brief Build a new Objective-C property reference expression.
1841e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  ///
1842e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1843e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
18449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
1845e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              ObjCPropertyDecl *Property,
1846e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              SourceLocation PropertyLoc) {
1847e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    CXXScopeSpec SS;
18489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1849e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
1850e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                   Sema::LookupMemberName);
1851e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    bool IsArrow = false;
1852e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1853e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         /*FIME:*/PropertyLoc,
1854d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
1855e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.isInvalid())
1856e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return getSema().ExprError();
1857c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1858e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.get())
1859e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return move(Result);
1860c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
18619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1862c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/PropertyLoc, IsArrow,
1863c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              SS,
1864e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*FirstQualifierInScope=*/0,
1865c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1866e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*TemplateArgs=*/0);
1867e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  }
1868c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1869c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// \brief Build a new Objective-C implicit setter/getter reference
18709cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// expression.
18719cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  ///
18729cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1873c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// Subclasses may override this routine to provide different behavior.
18749cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  OwningExprResult RebuildObjCImplicitSetterGetterRefExpr(
18759cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Getter,
18769cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          QualType T,
18779cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Setter,
18789cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        SourceLocation NameLoc,
18799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                          Expr *Base) {
18809cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // Since these expressions can only be value-dependent, we do not need to
18819cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // perform semantic analysis again.
18829ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(
18839cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
18849cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     Setter,
18859cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     NameLoc,
18869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                                     Base));
18879cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  }
18889cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor
1889f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C "isa" expression.
1890f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1891f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1892f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
18939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  OwningExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
1894f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                      bool IsArrow) {
1895f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
18969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1897f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
1898f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
1899f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    OwningExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1900f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IsaLoc,
1901d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
1902f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1903f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return getSema().ExprError();
1904c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1905f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1906f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1907c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
19089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1909c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IsaLoc, IsArrow, SS,
1910f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1911c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1912f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1913f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1914c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
19231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
19281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
19311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
19330da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
19351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
19415291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor                                                   Builtin->getCallResultType(),
1942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
19491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
19511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
195543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
195643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
195743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
195843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
19591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
196143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
19621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
196443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
196543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
196643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
19674bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
197043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
19717381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
197243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
19734bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
197443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
197543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
197643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
197743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
19781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take()));
198043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
19811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
198343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
198443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
19851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1987670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1988454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
1989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
19957381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
1996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1997454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
19984bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
20001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2002657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
2003657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
2004657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
2005dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
2006dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
2007a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
2008c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
2009c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
20100979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
20110979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
20121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
201343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
2014dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
2015dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
20161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
2017c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
2018c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
2019dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
2020dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
20211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
2023c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
2024a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
2025c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
2026dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2028dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
2029dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
20301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
2031a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
2032a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
2033a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
2034dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2037a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
2038c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
2039c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
20401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2041dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
20421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
2043dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
20447c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
20457c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       NNS->getAsNamespace()));
20461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
2047dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2048dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
2049dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2051dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2052dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2054dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
2055dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
2056dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
2057dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
20581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2059dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
2060dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
2061fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2062124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
2063124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
2064d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
2065d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2067dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
2068dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2069dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
2070dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
20731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2074edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   T);
2075dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
2076dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2078dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
20791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
2080dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
2081dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
2082dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
20832577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameInfo
20842577743c5650c646fb705df01403707e94f2df04Abramo BagnaraTreeTransform<Derived>
20852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
20862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               QualType ObjectType) {
20872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name = NameInfo.getName();
208881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
20892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return DeclarationNameInfo();
209081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
209181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
209281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
209381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
209481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
209581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
209681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
20973e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
209881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
20992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NameInfo;
21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
210181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
210281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
210381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
21042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    TypeSourceInfo *NewTInfo;
21052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CanQualType NewCanTy;
21062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
21072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       NewTInfo = getDerived().TransformType(OldTInfo, ObjectType);
21082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       if (!NewTInfo)
21092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara         return DeclarationNameInfo();
21102577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
21112577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
21122577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    else {
21132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewTInfo = 0;
21142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
21152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      QualType NewT = getDerived().TransformType(Name.getCXXNameType(),
21162577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                 ObjectType);
21172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      if (NewT.isNull())
21182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        return DeclarationNameInfo();
21192577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewCanTy = SemaRef.Context.getCanonicalType(NewT);
21202577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
21211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName NewName
21232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
21242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                           NewCanTy);
21252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NewNameInfo(NameInfo);
21262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setName(NewName);
21272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setNamedTypeInfo(NewTInfo);
21282577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NewNameInfo;
212981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
21301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
21311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(0 && "Unknown name kind.");
21332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return DeclarationNameInfo();
213481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
213581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
213681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
21371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
21383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
21393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
21407c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  SourceLocation Loc = getDerived().getBaseLocation();
21417c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor
2142d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
21431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2144d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
2145124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2146124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
2147d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
2148d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2150d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
21511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
21527c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2153d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
2154d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
21551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2156d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
2157d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
2158d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
2159d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
21601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2161d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
2162d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
2163d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
21641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2165f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
2166f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
2167d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2169d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
21701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2171d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
2172124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2173124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
21743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
2175d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2177d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2178dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
2179dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
2180d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2182ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
2183c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
2184ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
2185c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2186c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
2187ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
2188d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2190d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
21927c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2193d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
2194d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2196d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2197d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
2198d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2200d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
2201d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
22021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2203f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
2204f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
2205f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
2206d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
2207d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
2208d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
2209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
2210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
2211833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2212833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
2213670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
2214670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
22159f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
2216833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2217833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2218833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
2219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
2220a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2221c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2223833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2224788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
2225788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
2226788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
2227c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
2229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2232833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
2233670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
2234833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
2235828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2237833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
2242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
2243833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2244833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
2245833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
2246833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
2247833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
2248833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
2249833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2251670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
2252a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2253833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
2254a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2255833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2256833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
2257833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
2258833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2259833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2260833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2261670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2263670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
2264833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
2265972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
2266972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2267972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
2268788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
22697c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2270833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
2271833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2272828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
2273828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
2274828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
2275828bff2079b6a91ecd7ed5b842c59527d7682789John McCall                                                   Action::Unevaluated);
2276828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
22779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      SourceExpr = (E.isInvalid() ? 0 : E.take());
2278828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
2279828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2280828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2281833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2282670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2284788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
2285c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
2286788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
2287788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
2288788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
2289788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
2290c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2291788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
2292788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
2293788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
2294788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
2295788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
2296c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2297670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
2298670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
22991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
2300670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
23011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
2303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2304833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2305833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Sema::OwningExprResult E
2306833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2307833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
23089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take());
2309833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2310670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2312670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2313670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2314670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
23151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2316670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2317670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
23181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2319833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2321833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2322828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2323828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2324828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2325828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2326833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2327833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2328828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2329670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2330670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
23311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2332670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2333828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2334833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2335670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2336670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2338670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2339833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2340670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2341670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2347c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntQualType TreeTransform<Derived>::TransformType(QualType T,
2348124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
23511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2353a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2354a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
23554802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2356c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2357124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
23581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2360a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
23611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2362a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2366124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2367124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
23701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
23721bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2373a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
23751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2376124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2377a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
23791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2380a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2385124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2386124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2387a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2389a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2390a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2391124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2392124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2393a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2394a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
23969f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2403a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2404a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
24051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2407a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2408124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualifiedTypeLoc T,
2409124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2410a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2412124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2413124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
24161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
24221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24232865474261a608c7873b87ba4af110d17907896dJohn McCall  if (!Quals.empty()) {
24242865474261a608c7873b87ba4af110d17907896dJohn McCall    Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
24252865474261a608c7873b87ba4af110d17907896dJohn McCall    TLB.push<QualifiedTypeLoc>(Result);
24262865474261a608c7873b87ba4af110d17907896dJohn McCall    // No location information to preserve.
24272865474261a608c7873b87ba4af110d17907896dJohn McCall  }
2428a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2429a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2430a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2431a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2433a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2434a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2438a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2441124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      BuiltinTypeLoc T,
2442124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2443ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2444ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
2445ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
2446ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2447ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2451a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2452124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      ComplexTypeLoc T,
2453124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2454a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2455a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2456a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
24571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2458a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2459a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2460c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                      PointerTypeLoc TL,
2461124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2462c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType PointeeType
2463c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
246492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType.isNull())
246592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return QualType();
246692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
246792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  QualType Result = TL.getType();
2468c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (PointeeType->getAs<ObjCObjectType>()) {
246992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // A dependent pointer type 'T *' has is being transformed such
247092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // that an Objective-C class type is being replaced for 'T'. The
247192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // resulting pointer type is an ObjCObjectPointerType, not a
247292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // PointerType.
2473c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
2474c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2475c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
2476c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    NewT.setStarLoc(TL.getStarLoc());
247792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Result;
247892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2479c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
248092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (getDerived().AlwaysRebuild() ||
248192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      PointeeType != TL.getPointeeLoc().getType()) {
248292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
248392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Result.isNull())
248492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return QualType();
248592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2486c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
248792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
248892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2489c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Result;
2490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2494a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2495124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  BlockPointerTypeLoc TL,
2496124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  QualType ObjectType) {
2497db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  QualType PointeeType
2498c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2499c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (PointeeType.isNull())
2500c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return QualType();
2501c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2502c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType Result = TL.getType();
2503c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (getDerived().AlwaysRebuild() ||
2504c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      PointeeType != TL.getPointeeLoc().getType()) {
2505c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildBlockPointerType(PointeeType,
2506db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor                                                  TL.getSigilLoc());
2507db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor    if (Result.isNull())
2508db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor      return QualType();
2509db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  }
2510db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor
251139968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
2512db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2513db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  return Result;
2514a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
251685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
251785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
251885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
251985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
252085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
252185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
252285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2523124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ReferenceTypeLoc TL,
2524124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
252585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
252685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
252785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
252885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
252985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
253085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
253185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
253285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
253385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
253485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
253585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
253685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
253785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
253885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
253985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
254085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
254185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
254285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
254385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
254485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
254585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
254685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
254785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
254885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
254985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
255085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
255185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
255285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2553a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2554a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2556124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 LValueReferenceTypeLoc TL,
2557124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2558124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2559a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2564124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 RValueReferenceTypeLoc TL,
2565124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2566124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
25701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2571a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2572124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   MemberPointerTypeLoc TL,
2573124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2576a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2581a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2582a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2586a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2587a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
259085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
259185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2592a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2599a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
26021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
26031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2604a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2605124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ConstantArrayTypeLoc TL,
2606124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2608a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2617a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
261885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
261985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2620a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2622a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2623c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2626a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
26271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2628a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2634a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2635a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2641124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              IncompleteArrayTypeLoc TL,
2642124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              QualType ObjectType) {
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2644a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2648a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2651a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2652a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
265385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
265485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2655a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2656a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2657a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2658c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2659a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2660a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2661a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2662a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2664a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2670124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   VariableArrayTypeLoc TL,
2671124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2677670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2678670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2679670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2680a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Size = SizeResult.take();
2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2687a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2688a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2689a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2692a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
26939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Size,
2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
269585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2696a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2697a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2699c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2700a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2701a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2702a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
27041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2705a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2706577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2710a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2711124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                             DependentSizedArrayTypeLoc TL,
2712124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2718670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2719670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
27201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Sema::OwningExprResult SizeResult
2722a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2731a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2732a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2733a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
27349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                         Size,
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
273685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2737a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2739577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
27411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2742a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2743a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2744a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2745a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2746a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2747a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2748a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2749a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2753577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2754a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2755124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      DependentSizedExtVectorTypeLoc TL,
2756124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2757a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2758a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2760577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2761577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2762577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2764670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2765670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2766670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2767577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2769577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2773eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2774eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2775a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
27769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                             Size.take(),
2777577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2778a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2779a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2781a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2782a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2783a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2784a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2788a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2789a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2793577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2796a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2797124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     VectorTypeLoc TL,
2798124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2799a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2800577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2801577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2802577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2803577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2804a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2805a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2806a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
280782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
2808788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      T->getAltiVecSpecific());
2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2810a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2811a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2812c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2814a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
28181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2820a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2821124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        ExtVectorTypeLoc TL,
2822124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2823a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2828a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2829a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2830a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2831a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2832a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2833a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2834a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2835a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2836a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2837c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2838a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2839a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2841a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2842577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2843577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
284521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
284621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
284721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
284821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
284921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
285021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
285121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
285221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
285321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
285421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
285521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
285621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
285721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
285821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
285921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
286021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
286121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
286216573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                               OldParm->getStorageClassAsWritten(),
286321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
286421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
286521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
286621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
286721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
286821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
286921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<QualType> &PTypes,
287021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
28721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2874a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2876a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2877a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2878a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2879a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
288021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
288121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
288221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2883a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2884a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2885a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2886a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2887a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2888a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2889a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2890a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2891a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2892a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
289321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2894a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
28951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
289621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PTypes.push_back(NewType);
289721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PVars.push_back(NewParm);
2898577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
28991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
290021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
290121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
290221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
290321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
290421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
290521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
290621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   FunctionProtoTypeLoc TL,
290721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   QualType ObjectType) {
2908895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // Transform the parameters. We do this first for the benefit of template
2909895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiations, so that the ParmVarDecls get/ placed into the template
2910895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  // instantiation scope before we transform the function type.
291121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
291221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
291321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
291421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return QualType();
2915c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2916895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  FunctionProtoType *T = TL.getTypePtr();
2917895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2918895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  if (ResultType.isNull())
2919895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor    return QualType();
2920c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2921a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2922a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2923a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2924a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2925a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2926a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2929fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getTypeQuals(),
2930fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getExtInfo());
2931a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2932a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2933a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
29341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2935a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2936a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2939a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2945577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2947124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 FunctionNoProtoTypeLoc TL,
2948124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 QualType ObjectType) {
2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2952a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2953a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2954a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2955a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2956a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2957a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2958a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2959a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2960a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2961a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2962a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2963a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2966ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2967ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2968124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 UnresolvedUsingTypeLoc TL,
2969124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2970ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
29717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2972ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
2973ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
2974ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2975ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
2976ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2977ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
2978ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
2979ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
2980ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
2981ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2982ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
2983ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
2984ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2985ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
2986ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2987ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
2988ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
2989ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2990577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2992124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypedefTypeLoc TL,
2993124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2994a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
29967c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
29977c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
2998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3001a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3002a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3003a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
3004a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
3005a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3006a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3007a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3008a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3009a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
3010a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3012a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3016a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
3017124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypeOfExprTypeLoc TL,
3018124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3019670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
3020670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3022cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  Sema::OwningExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3026a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3028cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
30299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Result = getDerived().RebuildTypeOfExprType(E.get());
3030a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3031a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3033a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
30341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3035a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3036cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3037cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3038cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3039a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3041577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
3045124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     TypeOfTypeLoc TL,
3046124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3047cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3048cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3049cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
3050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3053cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3054cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3055a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3056a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
30581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3059a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3060cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3061cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3062cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3063cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
3064a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3065a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
3070124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       DecltypeTypeLoc TL,
3071124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3072a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
3073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3074670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
3075670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
30761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
3078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3082a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3083a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
30849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Result = getDerived().RebuildDecltypeType(E.get());
3085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3086a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
3089a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3090a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
3091a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3093a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3094577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3095577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3096577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
3098124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     RecordTypeLoc TL,
3099124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
3101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
31027c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31037c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
3104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
3105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3107a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3108a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3109a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
3110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
3111a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3112a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
31141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3115a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
3116a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3117a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3118a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
3123124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   EnumTypeLoc TL,
3124124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
3126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
31277c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31287c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
3129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
3130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3132a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3133a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3134a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
3135a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
3136a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3137a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3138a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3139a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3140a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
3141a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3143a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31457da2431c23ef1ee8acb114e39692246e1801afc2John McCall
31463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
31473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
31483cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
31493cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         InjectedClassNameTypeLoc TL,
31503cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         QualType ObjectType) {
31513cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
31523cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
31533cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
31543cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
31563cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
31573cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
31583cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
31593cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
3163a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
3164124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                TemplateTypeParmTypeLoc TL,
3165124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                QualType ObjectType) {
3166a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
3167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
317049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
3171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
3172124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         SubstTemplateTypeParmTypeLoc TL,
3173124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         QualType ObjectType) {
3174a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
317549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
317649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
317749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
3178833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3179833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
3180833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3181833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
3182833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
3183a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3184833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
3185833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
3186833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
3187833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
3188833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3189828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
3190828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
3191828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
3192828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
3193828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
3194833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3195833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
3196833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
3197833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
3198833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
3199833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3200833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3201833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
3202833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
3203dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
3204c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3205dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
3206577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3207833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
3208833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
3209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
3211833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
32121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
3213dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
3214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
3215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
32161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3217d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
3218d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3219d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3220d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
3221d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
3222d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
3223d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
3224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
3225d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
3226d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
32271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
3229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
3231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
3232833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
3233d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
32341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3235833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
3236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
3237833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
3238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
3239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
3240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
3241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
3242833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
3243833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
32441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3245833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
3246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3249a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3250465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
3251465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                ElaboratedTypeLoc TL,
3252465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                QualType ObjectType) {
3253465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType *T = TL.getTypePtr();
3254465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
3255465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  NestedNameSpecifier *NNS = 0;
3256465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  // NOTE: the qualifier in an ElaboratedType is optional.
3257465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  if (T->getQualifier() != 0) {
3258465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3259e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                    TL.getQualifierRange(),
3260465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                    ObjectType);
3261465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (!NNS)
3262465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return QualType();
3263465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
32641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3265e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType NamedT;
3266e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // FIXME: this test is meant to workaround a problem (failing assertion)
3267e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // occurring if directly executing the code in the else branch.
3268e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (isa<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc())) {
3269e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc OldNamedTL
3270e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = cast<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc());
3271e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    const TemplateSpecializationType* OldTST
32729cbb4d81b98ee84795e267d51c1fa530ef6723bfJim Grosbach      = OldNamedTL.getType()->template getAs<TemplateSpecializationType>();
3273e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = TransformTemplateSpecializationType(OldTST, ObjectType);
3274e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3275e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3276e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc NewNamedTL
3277e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
3278e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewNamedTL.copy(OldNamedTL);
3279e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3280e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  else {
3281e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
3282e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3283e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3284e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3285a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar
3286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3288a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
3289e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      NamedT != T->getNamedType()) {
3290e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, NamedT);
3291a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3292a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3293a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3295465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3296e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setKeywordLoc(TL.getKeywordLoc());
3297e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setQualifierRange(TL.getQualifierRange());
3298a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3299a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
33034714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
33044714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor                                                       DependentNameTypeLoc TL,
3305124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
33064714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T = TL.getTypePtr();
3307833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
3309e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3310e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                TL.getQualifierRange(),
3311edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                ObjectType);
3312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
3313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331533500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result
331633500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
331733500955d731c73717af52088b7fc0e7a85681e7John McCall                                            T->getIdentifier(),
331833500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getKeywordLoc(),
331933500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getQualifierRange(),
332033500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getNameLoc());
3321a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3322a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
3323a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3324e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
3325e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    QualType NamedT = ElabT->getNamedType();
332633500955d731c73717af52088b7fc0e7a85681e7John McCall    TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
332733500955d731c73717af52088b7fc0e7a85681e7John McCall
3328e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3329e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3330e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
333133500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3332e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
3333e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3334e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
3335e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setNameLoc(TL.getNameLoc());
3336e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3337a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
334133500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>::
334233500955d731c73717af52088b7fc0e7a85681e7John McCall          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
334333500955d731c73717af52088b7fc0e7a85681e7John McCall                                 DependentTemplateSpecializationTypeLoc TL,
334433500955d731c73717af52088b7fc0e7a85681e7John McCall                                                       QualType ObjectType) {
334533500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType *T = TL.getTypePtr();
334633500955d731c73717af52088b7fc0e7a85681e7John McCall
334733500955d731c73717af52088b7fc0e7a85681e7John McCall  NestedNameSpecifier *NNS
334833500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
334933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                TL.getQualifierRange(),
335033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ObjectType);
335133500955d731c73717af52088b7fc0e7a85681e7John McCall  if (!NNS)
335233500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
335333500955d731c73717af52088b7fc0e7a85681e7John McCall
335433500955d731c73717af52088b7fc0e7a85681e7John McCall  TemplateArgumentListInfo NewTemplateArgs;
335533500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
335633500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
335733500955d731c73717af52088b7fc0e7a85681e7John McCall
335833500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = T->getNumArgs(); I != E; ++I) {
335933500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateArgumentLoc Loc;
336033500955d731c73717af52088b7fc0e7a85681e7John McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(I), Loc))
336133500955d731c73717af52088b7fc0e7a85681e7John McCall      return QualType();
336233500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTemplateArgs.addArgument(Loc);
336333500955d731c73717af52088b7fc0e7a85681e7John McCall  }
336433500955d731c73717af52088b7fc0e7a85681e7John McCall
336533500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
336633500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getKeyword(),
336733500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NNS,
336833500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getIdentifier(),
336933500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     TL.getNameLoc(),
337033500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NewTemplateArgs);
337133500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Result.isNull())
337233500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
337333500955d731c73717af52088b7fc0e7a85681e7John McCall
337433500955d731c73717af52088b7fc0e7a85681e7John McCall  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
337533500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType NamedT = ElabT->getNamedType();
337633500955d731c73717af52088b7fc0e7a85681e7John McCall
337733500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the template specialization.
337833500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateSpecializationTypeLoc NamedTL
337933500955d731c73717af52088b7fc0e7a85681e7John McCall      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
338033500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setLAngleLoc(TL.getLAngleLoc());
338133500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setRAngleLoc(TL.getRAngleLoc());
338233500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
338333500955d731c73717af52088b7fc0e7a85681e7John McCall      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
338433500955d731c73717af52088b7fc0e7a85681e7John McCall
338533500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the elaborated type.
338633500955d731c73717af52088b7fc0e7a85681e7John McCall    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
338733500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setKeywordLoc(TL.getKeywordLoc());
338833500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setQualifierRange(TL.getQualifierRange());
338933500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3390e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TypeLoc NewTL(Result, TL.getOpaqueData());
3391e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TLB.pushFullCopy(NewTL);
339233500955d731c73717af52088b7fc0e7a85681e7John McCall  }
339333500955d731c73717af52088b7fc0e7a85681e7John McCall  return Result;
339433500955d731c73717af52088b7fc0e7a85681e7John McCall}
339533500955d731c73717af52088b7fc0e7a85681e7John McCall
339633500955d731c73717af52088b7fc0e7a85681e7John McCalltemplate<typename Derived>
3397a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3399124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ObjCInterfaceTypeLoc TL,
3400124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3401ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCInterfaceType is never dependent.
3402c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3403c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return TL.getType();
3404c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3405c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
3406c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived>
3407c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType
3408c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
3409c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                ObjCObjectTypeLoc TL,
3410c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                QualType ObjectType) {
3411c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCObjectType is never dependent.
3412c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3413ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
3414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3419124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjCObjectPointerTypeLoc TL,
3420124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3421ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCObjectPointerType is never dependent.
3422c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3423ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
342424fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
342524fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
34321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
343343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
343543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
343843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
343943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
344043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
344143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
344243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
344443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
344543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
3446ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Statements(getSema());
344743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
344843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
344943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
345143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
34521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
345443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
345543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
345843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
34591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
346043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
346143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
346243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
346343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
346443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
346543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
34661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
346743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
346843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
34691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
3470ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult LHS, RHS;
3471264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3472264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3473264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
34741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3475264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3476264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3477264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3478264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
34791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3480264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the right-hand case value (for the GNU case-range extension).
3481264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    RHS = getDerived().TransformExpr(S->getRHS());
3482264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (RHS.isInvalid())
3483264c1f8ec895952466eab59b84b8b06801e721faEli Friedman      return SemaRef.StmtError();
3484264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  }
34851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
348643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
348743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
348843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
348943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
34909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       LHS.get(),
349143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
34929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       RHS.get(),
349343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
349443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
349543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
349843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
349943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
350043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
35039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
350443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
350543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
350643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
350743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
350943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
351043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
351143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
351243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
351543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
35169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubStmt.get());
351743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
351943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
352043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
352243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
352343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
352443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
352743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
352843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
35299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SubStmt.get());
353043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
35311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
353243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
35331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
35341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
353543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
3536ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult Cond;
35378cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  VarDecl *ConditionVar = 0;
35388cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor  if (S->getConditionVariable()) {
3539c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
35408cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      = cast_or_null<VarDecl>(
3541aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3542aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3543aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
35448cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    if (!ConditionVar)
35458cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor      return SemaRef.StmtError();
354699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
35478cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3548c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
354999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
355099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3551eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
3552eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    // Convert the condition to a boolean value.
3553afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3554afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3555afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getIfLoc(),
35569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3557afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3558afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3559eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
35609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE.get();
3561afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
356299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
3563c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
35649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
35659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
3566eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3567eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
356843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
356943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
357043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
357143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
357443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
357543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
357643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
35771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
35799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
358099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
358143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
358243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
35831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
35841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3585eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
35869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Then.get(),
35879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    S->getElseLoc(), Else.get());
358843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
358943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
359043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
359143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
35921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
359343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
3594ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult Cond;
3595d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  VarDecl *ConditionVar = 0;
3596d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor  if (S->getConditionVariable()) {
3597c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
3598d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      = cast_or_null<VarDecl>(
3599aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3600aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3601aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
3602d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    if (!ConditionVar)
3603d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor      return SemaRef.StmtError();
360499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3605d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3606c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
360799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
360899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
360999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
3612586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor  OwningStmtResult Switch
36139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
3614586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          ConditionVar);
361543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
361643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
361943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
362043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
362143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
36249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
36259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Body.get());
362643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
362843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
362943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
36301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
363143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
3632ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult Cond;
36335656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  VarDecl *ConditionVar = 0;
36345656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor  if (S->getConditionVariable()) {
3635c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
36365656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      = cast_or_null<VarDecl>(
3637aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3638aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3639aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
36405656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    if (!ConditionVar)
36415656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor      return SemaRef.StmtError();
364299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
36435656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3644c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
364599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
364699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3647afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3648afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3649afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
3650afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3651eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                                             S->getWhileLoc(),
36529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3653afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3654afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
36559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE;
3656afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
365799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
36609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
3661eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3662eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
366343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
366443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
366543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
366643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
366843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
36699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
367099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      ConditionVar == S->getConditionVariable() &&
367143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(S);
36731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3674eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
36759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       ConditionVar, Body.get());
367643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
36771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
367843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
367943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
368043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
368143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
368243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
368343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
368443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
36851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3686eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  // Transform the condition
3687eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3688eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (Cond.isInvalid())
3689eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3690eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
369143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
369243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
369343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
36941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
36951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
36979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    /*FIXME:*/S->getWhileLoc(), Cond.get(),
369843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
369943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
370243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
370443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
370543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
370643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
370743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
3710ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult Cond;
371199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  VarDecl *ConditionVar = 0;
371299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  if (S->getConditionVariable()) {
3713c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ConditionVar
371499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      = cast_or_null<VarDecl>(
3715aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                   getDerived().TransformDefinition(
3716aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                      S->getConditionVariable()->getLocation(),
3717aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                    S->getConditionVariable()));
371899e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (!ConditionVar)
371999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
372099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
372199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3722c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
372399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
372499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor      return SemaRef.StmtError();
3725afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3726afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3727afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
3728afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      OwningExprResult CondE = getSema().ActOnBooleanCondition(0,
3729afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getForLoc(),
37309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3731afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3732afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor        return getSema().StmtError();
3733afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
37349ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Cond = CondE.get();
3735afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    }
373699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
37371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37389ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take()));
37399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
3740eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3741eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
374243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
374343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
374443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
374543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get()));
37489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (S->getInc() && !FullInc.get())
3749eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    return SemaRef.StmtError();
3750eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
375143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
375243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
375343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
375443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
375643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
375743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
37589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      FullCond.get() == S->getCond() &&
375943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
376043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
37611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
37621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
376343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
37649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Init.get(), FullCond, ConditionVar,
37659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     FullInc, S->getRParenLoc(), Body.get());
376643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
376743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
376843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
37691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
37701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
377143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
37721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
377343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
377443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
377543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
377643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
377743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
377943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
378043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
378143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
37821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
378343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
378443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
37851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
378643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
378743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
37889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Target.get());
378943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
379043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
379143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
379243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
37941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
379543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
379743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
379843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
37991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
380143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
380343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
380443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
380643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
380743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
380843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
380943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
38101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
381143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
38129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
381343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
381543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
381643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
381843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
381943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
382043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
382143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
3822aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(),
3823aac571c68de0a7c58d92fba0057e308f0e6d115cDouglas Gregor                                                         *D);
382443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
382543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
38261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
382743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
382843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
38291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
383143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
38321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
38341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
38351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
383743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
383843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
384043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
384143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
38421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
384343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
38441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
384543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
384643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
384743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
384843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
384943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3850c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3851ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Constraints(getSema());
3852ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Exprs(getSema());
3853ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 4> Names;
3854a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson
3855ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult AsmString;
3856ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Clobbers(getSema());
3857703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3858703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  bool ExprsChanged = false;
3859c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3860703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the outputs.
3861703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
3862ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getOutputIdentifier(I));
3863c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3864703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3865703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain());
3866c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3867703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the output expr.
3868703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *OutputExpr = S->getOutputExpr(I);
3869703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(OutputExpr);
3870703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3871703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3872c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3873703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != OutputExpr;
3874c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
38759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Exprs.push_back(Result.get());
3876703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3877c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the inputs.
3879703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
3880ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(S->getInputIdentifier(I));
3881c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3882703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // No need to transform the constraint literal.
3883703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain());
3884c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3885703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    // Transform the input expr.
3886703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Expr *InputExpr = S->getInputExpr(I);
3887703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    OwningExprResult Result = getDerived().TransformExpr(InputExpr);
3888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3889703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson      return SemaRef.StmtError();
3890c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3891703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    ExprsChanged |= Result.get() != InputExpr;
3892c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
38939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Exprs.push_back(Result.get());
3894703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
3895c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3896703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  if (!getDerived().AlwaysRebuild() && !ExprsChanged)
3897703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    return SemaRef.Owned(S->Retain());
3898703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3899703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // Go through the clobbers.
3900703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
3901703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    Clobbers.push_back(S->getClobber(I)->Retain());
3902703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3903703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  // No need to transform the asm string literal.
3904703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  AsmString = SemaRef.Owned(S->getAsmString());
3905703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson
3906703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  return getDerived().RebuildAsmStmt(S->getAsmLoc(),
3907703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isSimple(),
3908703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isVolatile(),
3909703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumOutputs(),
3910703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getNumInputs(),
3911a5a79f7d16b48d3be8bcc8c7650e31aefd92b657Anders Carlsson                                     Names.data(),
3912703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Constraints),
3913703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Exprs),
39149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     AsmString.get(),
3915703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     move_arg(Clobbers),
3916703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->getRParenLoc(),
3917703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                     S->isMSAsm());
391843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
391943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
392043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
392143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
392243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
39244dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body of the @try.
39254dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
39264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (TryBody.isInvalid())
39274dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
3928c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39298f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  // Transform the @catch statements (if present).
39308f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool AnyCatchChanged = false;
3931ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> CatchStmts(SemaRef);
39328f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
39338f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    OwningStmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
39344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Catch.isInvalid())
39354dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
39368f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    if (Catch.get() != S->getCatchStmt(I))
39378f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      AnyCatchChanged = true;
39388f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    CatchStmts.push_back(Catch.release());
39394dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
3940c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39414dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the @finally statement (if present).
3942ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningStmtResult Finally;
39434dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (S->getFinallyStmt()) {
39444dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    Finally = getDerived().TransformStmt(S->getFinallyStmt());
39454dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Finally.isInvalid())
39464dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      return SemaRef.StmtError();
39474dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
39484dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
39494dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
39504dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
39514dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      TryBody.get() == S->getTryBody() &&
39528f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      !AnyCatchChanged &&
39534dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Finally.get() == S->getFinallyStmt())
39544dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
3955c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
39564dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
39579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
39589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           move_arg(CatchStmts), Finally.get());
395943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
396143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
396243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
3964be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  // Transform the @catch parameter, if there is one.
3965be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *Var = 0;
3966be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (VarDecl *FromVar = S->getCatchParamDecl()) {
3967be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    TypeSourceInfo *TSInfo = 0;
3968be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (FromVar->getTypeSourceInfo()) {
3969be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
3970be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (!TSInfo)
3971be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor        return SemaRef.StmtError();
3972be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3973c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3974be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    QualType T;
3975be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (TSInfo)
3976be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = TSInfo->getType();
3977be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    else {
3978be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      T = getDerived().TransformType(FromVar->getType());
3979be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      if (T.isNull())
3980c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt        return SemaRef.StmtError();
3981be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3982c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3983be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
3984be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (!Var)
3985be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor      return SemaRef.StmtError();
3986be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
3987c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3988be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getCatchBody());
3989be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (Body.isInvalid())
3990be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return SemaRef.StmtError();
3991c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3992c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
3993be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                             S->getRParenLoc(),
39949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Var, Body.get());
399543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
39961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
399743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
399843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
39991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
40004dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body.
40014dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
40024dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (Body.isInvalid())
40034dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.StmtError();
4004c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // If nothing changed, just retain this statement.
40064dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
40074dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor      Body.get() == S->getFinallyBody())
40084dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    return SemaRef.Owned(S->Retain());
40094dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
40104dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Build a new statement.
40114dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
40129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                               Body.get());
401343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
401543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
401643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
40171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
4018ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult Operand;
4019d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (S->getThrowExpr()) {
4020d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    Operand = getDerived().TransformExpr(S->getThrowExpr());
4021d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    if (Operand.isInvalid())
4022d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      return getSema().StmtError();
4023d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
4024c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4025d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4026d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor      Operand.get() == S->getThrowExpr())
4027d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    return getSema().Owned(S->Retain());
4028c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
403043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
40311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
403243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
403343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
403443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
40351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
40368fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the object we are locking.
40378fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
40388fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Object.isInvalid())
40398fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
4040c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40418fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the body.
40428fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getSynchBody());
40438fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Body.isInvalid())
40448fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.StmtError();
4045c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40468fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // If nothing change, just retain the current statement.
40478fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
40488fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Object.get() == S->getSynchExpr() &&
40498fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor      Body.get() == S->getSynchBody())
40508fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor    return SemaRef.Owned(S->Retain());
40518fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor
40528fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Build a new statement.
40538fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
40549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    Object.get(), Body.get());
405543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
405643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
405743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
405843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
405943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
40601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
4061c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the element statement.
4062c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult Element = getDerived().TransformStmt(S->getElement());
4063c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Element.isInvalid())
4064c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4065c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4066c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the collection expression.
4067c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningExprResult Collection = getDerived().TransformExpr(S->getCollection());
4068c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Collection.isInvalid())
4069c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4070c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4071c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the body.
4072c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
4073c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Body.isInvalid())
4074c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.StmtError();
4075c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4076c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // If nothing changed, just retain this statement.
4077c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
4078c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Element.get() == S->getElement() &&
4079c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Collection.get() == S->getCollection() &&
4080c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor      Body.get() == S->getBody())
4081c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return SemaRef.Owned(S->Retain());
4082c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4083c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Build a new statement.
4084c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
4085c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   /*FIXME:*/S->getForLoc(),
40869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Element.get(),
40879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Collection.get(),
4088c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                   S->getRParenLoc(),
40899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Body.get());
409043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
409143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
409243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
409343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
409443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
409543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
409643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
409743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
409843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
409943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
410043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
410143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
410243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
410343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
410443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
410543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
41061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
410743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
410843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
4109a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                            ExceptionDecl->getTypeSourceInfo(),
411043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
411143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
411243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
411343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
4114ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor    if (!Var || Var->isInvalidDecl())
411543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
411643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
411843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
411943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
4120ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor  if (Handler.isInvalid())
412143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
41221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
412343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
412443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
412543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
41261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
412743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
412843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
412943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
41309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Handler.get());
413143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
41321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
413343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
413443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
413543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
413643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
41371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
413843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
413943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
414043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
41411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
414243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
414343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
4144ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Handlers(SemaRef);
414543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
41461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
414743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
414843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
414943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
41501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
415143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
415243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
415343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
415543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
415643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
415743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
41581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
415943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
41609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
41611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
416243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
41631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
416443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
4166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
41671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4169454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
41701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
41711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
41721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
41741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4175454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
4176a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
4177a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (E->getQualifier()) {
4178a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4179edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                       E->getQualifierRange());
4180a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    if (!Qualifier)
4181a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      return SemaRef.ExprError();
4182a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4183dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4184dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  ValueDecl *ND
41857c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
41867c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getDecl()));
4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4190ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  DeclarationNameInfo NameInfo = E->getNameInfo();
4191ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  if (NameInfo.getName()) {
4192ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
4193ec8045d3f0375302eadaa63deb373bacaf25a569John McCall    if (!NameInfo.getName())
4194ec8045d3f0375302eadaa63deb373bacaf25a569John McCall      return SemaRef.ExprError();
4195ec8045d3f0375302eadaa63deb373bacaf25a569John McCall  }
41962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
41972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!getDerived().AlwaysRebuild() &&
4198a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      Qualifier == E->getQualifier() &&
4199a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor      ND == E->getDecl() &&
42002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NameInfo.getName() == E->getDecl()->getDeclName() &&
4201096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
42021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4203dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // Mark it referenced in the new context regardless.
4204dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: this is a bit instantiation-specific.
4205dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
4206a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
4207dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    return SemaRef.Owned(E->Retain());
4208a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
4209dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4210dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  TemplateArgumentListInfo TransArgs, *TemplateArgs = 0;
4211096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
4212dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TemplateArgs = &TransArgs;
4213dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4214dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
4215dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4216dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TemplateArgumentLoc Loc;
4217dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
4218dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall        return SemaRef.ExprError();
4219dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall      TransArgs.addArgument(Loc);
4220dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    }
4221dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  }
4222dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
4223a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
42242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, TemplateArgs);
4225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4229454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
42301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4235454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
42361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4241454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
42421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
42461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4247454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
42481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4253454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
42541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4259454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
42651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
4268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
4269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
42711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
42721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4273454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
4274454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
42801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
42839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get());
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
42871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
42888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
42898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform the type.
42908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
42918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!Type)
42928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().ExprError();
4293c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
42948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform all of the components into components similar to what the
42958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // parser uses.
4296c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // FIXME: It would be slightly more efficient in the non-dependent case to
4297c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // just map FieldDecls, rather than requiring the rebuilder to look for
4298c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // the fields again. However, __builtin_offsetof is rare enough in
42998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // template code that we don't care.
43008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool ExprChanged = false;
43018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef Action::OffsetOfComponent Component;
43028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
43038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  llvm::SmallVector<Component, 4> Components;
43048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
43058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    const Node &ON = E->getComponent(I);
43068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Component Comp;
430772be24f39c162448e53dd73cf57cc6357114361eDouglas Gregor    Comp.isBrackets = true;
43088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocStart = ON.getRange().getBegin();
43098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Comp.LocEnd = ON.getRange().getEnd();
43108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (ON.getKind()) {
43118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array: {
43128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
43138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(FromIndex);
43148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (Index.isInvalid())
43158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor        return getSema().ExprError();
4316c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      ExprChanged = ExprChanged || Index.get() != FromIndex;
43188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = true;
43199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      Comp.U.E = Index.get();
43208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
43218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4322c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
43248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
43258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.isBrackets = false;
43268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Comp.U.IdentInfo = ON.getFieldName();
432729d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor      if (!Comp.U.IdentInfo)
432829d2fd56b5eeeb52f7fdbdd232229e570c30d62bDouglas Gregor        continue;
4329c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4331c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4332cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    case Node::Base:
4333cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      // Will be recomputed during the rebuild.
4334cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
43358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
4336c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Components.push_back(Comp);
43388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
4339c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // If nothing changed, retain the existing expression.
43418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
43428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      Type == E->getTypeSourceInfo() &&
43438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      !ExprChanged)
43448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return SemaRef.Owned(E->Retain());
4345c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
43468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Build a new offsetof expression.
43478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
43488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          Components.data(), Components.size(),
43498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          E->getRParenLoc());
43508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
43518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
43528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregortemplate<typename Derived>
43538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorSema::OwningExprResult
4354454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
4356a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *OldT = E->getArgumentTypeInfo();
43575557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor
4358a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *NewT = getDerived().TransformType(OldT);
43595ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!NewT)
4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43625ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    if (!getDerived().AlwaysRebuild() && OldT == NewT)
4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
43641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43655ab75172051a6d2ea71a80a79e81c65519fd3462John McCall    return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
43661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4370ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  Sema::OwningExprResult SubExpr;
43711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
43761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildSizeOfAlignOf(SubExpr.get(), E->getOperatorLoc(),
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
43891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
43911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4392454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildArraySubscriptExpr(LHS.get(),
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
44099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                RHS.get(),
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
44141eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4415454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
4423ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
44291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
44331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
44359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(Arg.get());
4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
44371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
44421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
44441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
44469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
44531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4454454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
445983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
446083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
44611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
446283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4463edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  E->getQualifierRange());
4464c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
446583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
446683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
44671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4468f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman  ValueDecl *Member
44697c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
44707c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getMemberDecl()));
4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
44731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44746bb8017bb9e828d118e15e59d71c66bba323c364John McCall  NamedDecl *FoundDecl = E->getFoundDecl();
44756bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (FoundDecl == E->getMemberDecl()) {
44766bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = Member;
44776bb8017bb9e828d118e15e59d71c66bba323c364John McCall  } else {
44786bb8017bb9e828d118e15e59d71c66bba323c364John McCall    FoundDecl = cast_or_null<NamedDecl>(
44796bb8017bb9e828d118e15e59d71c66bba323c364John McCall                   getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
44806bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (!FoundDecl)
44816bb8017bb9e828d118e15e59d71c66bba323c364John McCall      return SemaRef.ExprError();
44826bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
44836bb8017bb9e828d118e15e59d71c66bba323c364John McCall
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
448683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
44878a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor      Member == E->getMemberDecl() &&
44886bb8017bb9e828d118e15e59d71c66bba323c364John McCall      FoundDecl == E->getFoundDecl() &&
4489096832c5ed5b9106fa177ebc148489760c3bc496John McCall      !E->hasExplicitTemplateArgs()) {
4490c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
44911f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // Mark it referenced in the new context regardless.
44921f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    // FIXME: this is a bit instantiation-specific.
44931f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson    SemaRef.MarkDeclarationReferenced(E->getMemberLoc(), Member);
44941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
44951f24032ea28d0df9d6227e4faf89306dfa990994Anders Carlsson  }
4496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4497d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs;
4498096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (E->hasExplicitTemplateArgs()) {
4499d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setLAngleLoc(E->getLAngleLoc());
4500d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.setRAngleLoc(E->getRAngleLoc());
45018a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4502d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TemplateArgumentLoc Loc;
4503d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
45048a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor        return SemaRef.ExprError();
4505d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall      TransArgs.addArgument(Loc);
45068a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor    }
45078a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor  }
4508c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
4510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
4511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
4512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4513c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
4514c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
4515c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
4516c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
4517c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
4518c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
45199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
4520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
452183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
452283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
45232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                        E->getMemberNameInfo(),
45248a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                        Member,
45256bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                        FoundDecl,
4526096832c5ed5b9106fa177ebc148489760c3bc496John McCall                                        (E->hasExplicitTemplateArgs()
4527d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                           ? &TransArgs : 0),
4528c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                        FirstQualifierInScope);
4529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4533454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
4534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
45451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
45461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
45489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            LHS.get(), RHS.get());
4549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
45511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
4554454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
4555454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
4556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4560454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
4561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
45721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
4577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
45781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildConditionalOperator(Cond.get(),
458047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
45819ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 LHS.get(),
458247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
45839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 RHS.get());
4584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
45871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4588454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
4589a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // Implicit casts are eliminated during transformation, since they
4590a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  // will be recomputed by semantic analysis after transformation.
45916eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return getDerived().TransformExpr(E->getSubExprAsWritten());
4592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
45951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4596454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
45979d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
45989d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
4599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
4600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
46011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
4602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
4603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
46041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46059d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
46069d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
46079d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
4608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4611a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
46126eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
46179d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
4618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
46191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46219d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
46229d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            NewT,
4623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
46249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            SubExpr.get());
4625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4629454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
463042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
463142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
463242f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
463342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return SemaRef.ExprError();
46341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
464042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall      OldT == NewT &&
4641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
46421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
46441d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // Note: the expression type doesn't necessarily match the
46451d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // type-as-written, but that's okay, because it should always be
46461d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall  // derivable from the initializer.
46471d7d8d66eff7ed0f3e957d330930cc9ab8047addJohn McCall
464842f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
4649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
46509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Init.get());
4651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4655454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
4656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
46591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
46621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
46651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
4666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
46679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
4668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4674454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
4675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
46761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4677ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> Inits(SemaRef);
4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
46821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
46849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Inits.push_back(Init.get());
4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
46881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
46891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
4691e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                      E->getRBraceLoc(), E->getType());
4692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
46931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4696454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
46981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
469943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
470443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
4705ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> ArrayExprs(SemaRef);
4706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
4707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
4708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
4709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
4712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
4714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
47161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
4718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
47241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
4728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
47291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
47311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
4741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
4742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
4743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
47441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
47471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
47599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                E->usesGNUSyntax(), Init.get());
4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
47631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
4765454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     ImplicitValueInitExpr *E) {
47665557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4767c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
47685557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // FIXME: Will we ever have proper type location here? Will we actually
47695557b25bdbd63536f687ebb63a0bab55aa227626Douglas Gregor  // need to transform the type?
4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
47761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
47771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
47821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4783454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
47849bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
47859bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo)
47869bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
47871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
47932cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara      TInfo == E->getWrittenTypeInfo() &&
4794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
47961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
47982cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                       TInfo, E->getRParenLoc());
4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
48021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4803454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4805ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*, 4> Inits(SemaRef);
4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
48101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
48129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Inits.push_back(Init.get());
4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
48141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
4823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
4824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
4825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4827454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
4828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
4830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4833c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntSema::OwningExprResult
4834454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
48351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
4842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
48431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
48459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      SubStmt.get(),
4846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
4847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4851454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
48523fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  TypeSourceInfo *TInfo1;
48533fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  TypeSourceInfo *TInfo2;
48549bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor
48559bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TInfo1 = getDerived().TransformType(E->getArgTInfo1());
48569bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo1)
48579bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48599bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TInfo2 = getDerived().TransformType(E->getArgTInfo2());
48609bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo2)
48619bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor    return SemaRef.ExprError();
4862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
48643fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara      TInfo1 == E->getArgTInfo1() &&
48653fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara      TInfo2 == E->getArgTInfo2())
48661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
48693fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                                 TInfo1, TInfo2,
48703fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                                 E->getRParenLoc());
4871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4875454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
4876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
48871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
4890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
4891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
48921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
48931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
48959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Cond.get(), LHS.get(), RHS.get(),
4896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
4897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
48981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
49001eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4901454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
49021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4907454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4908668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  switch (E->getOperator()) {
4909668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_New:
4910668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Delete:
4911668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_New:
4912668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Array_Delete:
4913668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
4914668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4915c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4916668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Call: {
4917668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // This is a call to an object's operator().
4918668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
4919668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4920668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the object itself.
4921668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    OwningExprResult Object = getDerived().TransformExpr(E->getArg(0));
4922668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4923668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      return SemaRef.ExprError();
4924668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4925668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // FIXME: Poor location information
4926668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    SourceLocation FakeLParenLoc
4927668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(
4928668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                              static_cast<Expr *>(Object.get())->getLocEnd());
4929668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4930668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Transform the call arguments.
4931ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> Args(SemaRef);
4932668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
4933668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) {
49346eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      if (getDerived().DropCallArgument(E->getArg(I)))
49356eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor        break;
4936c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4937668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4938668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4939668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        return SemaRef.ExprError();
4940668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4941668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      // FIXME: Poor source location information.
4942668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      SourceLocation FakeCommaLoc
4943668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor        = SemaRef.PP.getLocForEndOfToken(
4944668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                 static_cast<Expr *>(Arg.get())->getLocEnd());
4945668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      FakeCommaLocs.push_back(FakeCommaLoc);
4946668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      Args.push_back(Arg.release());
4947668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    }
4948668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
49499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
4950668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        move_arg(Args),
4951668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        FakeCommaLocs.data(),
4952668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor                                        E->getLocEnd());
4953668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4954668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4955668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
4956668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_##Name:
4957668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
4958668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor#include "clang/Basic/OperatorKinds.def"
4959668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Subscript:
4960668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    // Handled below.
4961668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    break;
4962668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4963668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_Conditional:
4964668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("conditional operator is not actually overloadable");
4965668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4966668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4967668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4968668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4969668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4970668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    return SemaRef.ExprError();
4971668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4972668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
49761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4977454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4981ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult Second;
4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
49871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
4990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
49911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
49921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
49931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
49969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Callee.get(),
49979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 First.get(),
49989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Second.get());
4999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5003454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
5004454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
50081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5009454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
50109d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
50119d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
50141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
5015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
50171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50189d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
50199d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
50209d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5024a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
50256eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
50309d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
50321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
50331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
50351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
5036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
5037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
5038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
5039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
5040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
5041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
50421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
5043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
50449d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                              NewT,
5045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
5046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
50479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              SubExpr.get(),
5048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
5049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
50521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5053454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
5054454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5059454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
5060454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
5066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
5067454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5072454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
5073454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
5079454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXFunctionalCastExpr *E) {
50809d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *OldT;
50819d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall  TypeSourceInfo *NewT;
5082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
5083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
50841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
50859d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    OldT = E->getTypeInfoAsWritten();
50869d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    NewT = getDerived().TransformType(OldT);
50879d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall    if (!NewT)
5088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5091a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor  OwningExprResult SubExpr
50926eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
50951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
50979d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      OldT == NewT &&
5098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
50991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
5103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
51049d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                   NewT,
5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
51069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr.get(),
5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
5108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5112454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
5113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
511457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    TypeSourceInfo *TInfo
511557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor      = getDerived().TransformType(E->getTypeOperandSourceInfo());
511657fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    if (!TInfo)
5117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
51181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
512057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor        TInfo == E->getTypeOperandSourceInfo())
5121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
51221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
512357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getType(),
512457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             E->getLocStart(),
512557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             TInfo,
5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
5130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
5131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
51321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
5133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
51341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
51411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
514357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getType(),
514457fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                           E->getLocStart(),
51459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get(),
5146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
5147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
51501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
5151454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
51521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
5158454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
51591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5164454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
5165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
51661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
51741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5175828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
5176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5180454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
5181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
51841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
51871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get());
5190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5194454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
51951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
51967c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
51977c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
5198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
520153cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
5202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
52041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5205036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
5206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5210ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
5211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
52191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
52201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5221ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  return getDerived().RebuildCXXScalarValueInitExpr(E->getTypeBeginLoc(),
5222ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                 /*FIXME:*/E->getTypeBeginLoc(),
5223ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    T,
5224ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    E->getRParenLoc());
5225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5229454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
5230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
5231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
5232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
5233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
5234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
5237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
5238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
5239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
52401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
5242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5243ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> PlacementArgs(SemaRef);
5244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
5245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
5246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
52481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
5250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
5251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
525343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
5254ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> ConstructorArgs(SemaRef);
5255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
5256ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor    if (getDerived().DropCallArgument(E->getConstructorArg(I)))
5257ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor      break;
5258ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor
5259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
5260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
52621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
5264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
5265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
52681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
52691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
52701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
52717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52727c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
52731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
52741af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52751af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52761af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52771af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
52781af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
52791af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
52807c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
52817c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
52821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
52831af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52841af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52851af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52861af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
52871af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
52881af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
52897c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52907c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
52911af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
52921af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
52931af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5294c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
5297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
52981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
52991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
53001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
53011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
53021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53031af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53041af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
53051af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
53061af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
53071af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
53081af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53091af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53111af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
53145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
53155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
53165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
53175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
53185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
53195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
53205b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
53215b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
53225b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
53235b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
5324c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      ArraySize
53255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        = SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
5326c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                  ConsArrayT->getSize(),
53275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  SemaRef.Context.getSizeType(),
53285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                                  /*FIXME:*/E->getLocStart()));
53295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
53305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
53315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
53325b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
53335b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
53345b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
53355b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
53365b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
53375b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
5338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
5339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
5340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
5342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
53434bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                        E->getTypeIdParens(),
5344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
5345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
53479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        ArraySize.get(),
5348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
53501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
5351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5355454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
5356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
5357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
5358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
53591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53601af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
53611af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
53621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
53631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
53647c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
53657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
53661af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
53671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      return SemaRef.ExprError();
53681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5369c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
53711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
53721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
53731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53741af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53751af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53761af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53781af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
5381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
5382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
53839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Operand.get());
5384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5388a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
5389454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
5390a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
5391a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
5392a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
53931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5394a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  Sema::TypeTy *ObjectTypePtr = 0;
5395a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
53969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
5397a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
5398a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
5399a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
5400a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
5401a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
5402a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    return SemaRef.ExprError();
5403c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5404a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  QualType ObjectType = QualType::getFromOpaquePtr(ObjectTypePtr);
5405a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
5406a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5407b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor                                                E->getQualifierRange(),
5408a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                ObjectType);
5409a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
5410a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
54111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5412a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
5413a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
5414a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
5415a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
5416a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
5417a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5418a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
5419a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
5420a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
5421a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
5422a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
5423a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
5424a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
5425a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
5426a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    CXXScopeSpec SS;
5427a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (Qualifier) {
5428a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setScopeRep(Qualifier);
5429a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setRange(E->getQualifierRange());
5430a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    }
5431c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5432a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Sema::TypeTy *T = SemaRef.getDestructorName(E->getTildeLoc(),
5433a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
5434a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
5435a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
5436a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
5437a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
5438a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
5439a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      return SemaRef.ExprError();
5440c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5441a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
5442a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
5443a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
5444a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
544526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
544626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
544726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
5448c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
5449a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                               ObjectType);
545026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
5451a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
5452a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
5453c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
5455a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
5456a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
5457a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
545826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getQualifierRange(),
545926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
546026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
5461fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
5462a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
5463a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
54641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5465a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
5466a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
5467ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
5468454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
5469f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
5470f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5471f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
5472f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
5473f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5474f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
5475f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
5476f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
54777c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
54787c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
54797c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
54809f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
54819f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
54829f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
54839f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
54849f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
54859f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
54869f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
54879f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5488f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5489f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
5490f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
5491f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5492f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5493f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
5494f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
5495f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
5496f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
5497f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5498f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
5499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5500f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5501f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
5502f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
5503f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
5504f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5505f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
5506f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
5507f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
5508f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
5509f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5510edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                    Old->getQualifierRange());
5511f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
5512f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5513c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5514f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
5515f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
5516c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  }
5517c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5518c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (Old->getNamingClass()) {
551966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    CXXRecordDecl *NamingClass
552066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
552166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                            Old->getNameLoc(),
552266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
552366c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
552466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5525c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
552666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5527f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5528f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5529f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
5530f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
5531f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
5532f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5533f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
5534f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
5535f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
5536f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5537f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
5538f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
5539f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.ExprError();
5540f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
5541f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5542f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5543f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
5544f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
5545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5549454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
5550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
55511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
55591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
55631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
5566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
5567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
5568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
5569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5573865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
55742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               DependentScopeDeclRefExpr *E) {
5575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
5576f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5577edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                E->getQualifierRange());
5578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
5579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
55801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
55822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
55832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
558481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
55851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5586f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
5587f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
5588f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
55892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // Note: it is sufficient to compare the Name component of NameInfo:
55902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // if name has not changed, DNLoc has not changed either.
55912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getDeclName())
5592f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
55931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5594f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5595f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
55962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                         NameInfo,
5597f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
5598f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
5599d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
5600d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5602d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5603d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
5605d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
5606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5608f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5609f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
56102577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
5611f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
5612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5616454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
5617321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
5618321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
5619321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
5620321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5621321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
5622321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
5623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
5628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
56317c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
56327c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
56351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5637ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
56381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
5640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
56416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
56426eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
56436eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
56446eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
56456eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
5646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
56491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
56519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(TransArg.get());
5652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
5657c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
56581af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
56591af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
5660c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
5662c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
56631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56644411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
56654411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
56668c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              move_arg(Args),
56678c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              E->requiresZeroInitialization(),
56688c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              E->getConstructionKind());
5669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
5672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56735132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
56745132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
5675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5677454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
56785132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5681eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// \brief Transform a C++ reference-binding expression.
5682eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson///
5683eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// Since CXXBindReferenceExpr nodes are implicitly generated, we just
5684eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson/// transform the subexpression and return that.
5685eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssontemplate<typename Derived>
5686eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonSema::OwningExprResult
5687eb60edffa147e061278c436e513b0df9b4c4e7f6Anders CarlssonTreeTransform<Derived>::TransformCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
5688eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  return getDerived().TransformExpr(E->getSubExpr());
5689eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
5690eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
56911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
5692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
5693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56945132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
56955132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
5696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
56995132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
57005132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5706454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXTemporaryObjectExpr *E) {
5707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
5714c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                  getDerived().TransformDecl(E->getLocStart(),
57157c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5720ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
5721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
57221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
5724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
572591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
572691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      ArgumentChanged = true;
572791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      break;
572891be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    }
572991be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor
5730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
57331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
5736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
574191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
574291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
574391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
5744a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth    return SemaRef.MaybeBindToTemporary(E->Retain());
574591be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
57461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
5748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
5749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
5750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
57511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
5752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
5753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
5755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
5756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
5757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
5758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
5759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
5760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5765454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
5766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
5767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
5768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
57701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5772ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
5773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
5774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
5776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
5777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
5778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
57801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
5783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
57849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(TransArg.get());
5785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
5789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
57901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
57911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
5793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
5794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
5795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
5796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
5797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
5798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
5799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
58001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
5803865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
58042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                             CXXDependentScopeMemberExpr *E) {
5805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
5806ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult Base((Expr*) 0);
5807aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
5808aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5809aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
5810aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
5811aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
5812aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
5813aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5814aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
58151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5816aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
5817aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Sema::TypeTy *ObjectTy = 0;
5818d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
58199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
5820aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
5821a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
5822d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
5823d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
5824aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5825aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5826aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
5827aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = QualType::getFromOpaquePtr(ObjectTy);
5828aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5829aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5830aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
5831aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
5832aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5833aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
58341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58356cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
58366cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
5837c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
58386cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
58396cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
58406cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
58411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5842a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
5843a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
5844a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5845a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
5846aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
5847aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
5848a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
5849a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
5850a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
58511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
58532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo(),
58542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                ObjectType);
58552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
585681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
58571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5858aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
58593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
58603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
58613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
5862aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
5863aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
58643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
58652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getMember() &&
58663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
58671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
58681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
5870aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
58713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
58723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
58733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
58743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
5875129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
58762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
5877129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
58783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
5880d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
58813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5882d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5883d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
58843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
5885d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
58863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
5889aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
5890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
5891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
5892a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
5893a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
58943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
58952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                     NameInfo,
5896129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
5897129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
5898129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5899129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
5900129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallSema::OwningExprResult
5901454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5902129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
5903ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  OwningExprResult Base((Expr*) 0);
5904aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5905aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
5906aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
5907aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5908aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall      return SemaRef.ExprError();
5909aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5910aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5911aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5912aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5913129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5914129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5915129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5916129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5917129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5918edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  Old->getQualifierRange());
5919129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5920129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      return SemaRef.ExprError();
5921129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5922129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
59232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  LookupResult R(SemaRef, Old->getMemberNameInfo(),
5924129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5925129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5926129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5927129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5928129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
59297c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
59307c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
59317c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
59329f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
59339f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
59349f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
59359f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
59369f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
59379f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
59389f54ad4381370c6b771424b53d219e661d6d6706John McCall        return SemaRef.ExprError();
59399f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5940129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5941129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5942129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5943129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5944129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5945129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5946129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5947129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5948129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5949129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5950129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5951129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5952129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5953129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5954129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5955c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  // Determine the naming class.
5956042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth  if (Old->getNamingClass()) {
5957c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    CXXRecordDecl *NamingClass
5958c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
595966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                          Old->getMemberLoc(),
596066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
596166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
596266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      return SemaRef.ExprError();
5963c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
596466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5965c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
5966c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5967129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5968129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5969129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5970129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5971129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5972129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5973129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5974129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5975129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        return SemaRef.ExprError();
5976129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5977129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5978129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5979c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
5980c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5981c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5982c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5983c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5984c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5985c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
59869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
5987aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
5988129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
5989129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
5990129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
5991129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
5992c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
5993129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
5994129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
5995129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
5996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
5999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
6000454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
60011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6006454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
600781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *EncodedTypeInfo
600881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
600981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!EncodedTypeInfo)
6010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
60111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
601381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
60141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
6015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
6016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
601781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                            EncodedTypeInfo,
6018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
6019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
60201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
6023454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
602492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Transform arguments.
602592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  bool ArgChanged = false;
6026ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
602792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
602892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
602992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Arg.isInvalid())
603092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
6031c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
603292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
60339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(Arg.get());
603492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
603592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
603692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
603792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Class message: transform the receiver type.
603892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    TypeSourceInfo *ReceiverTypeInfo
603992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      = getDerived().TransformType(E->getClassReceiverTypeInfo());
604092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!ReceiverTypeInfo)
604192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.ExprError();
6042c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
604392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If nothing changed, just retain the existing message send.
604492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
604592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
604692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.Owned(E->Retain());
604792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
604892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Build a new class message send.
604992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
605092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getSelector(),
605192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getMethodDecl(),
605292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getLeftLoc(),
605392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               move_arg(Args),
605492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getRightLoc());
605592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
605692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
605792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Instance message: transform the receiver
605892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
605992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor         "Only class and instance messages may be instantiated");
606092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  OwningExprResult Receiver
606192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    = getDerived().TransformExpr(E->getInstanceReceiver());
606292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (Receiver.isInvalid())
606392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.ExprError();
606492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
606592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // If nothing changed, just retain the existing message send.
606692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
606792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
606892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.Owned(E->Retain());
6069c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
607092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Build a new instance message send.
60719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCMessageExpr(Receiver.get(),
607292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getSelector(),
607392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getMethodDecl(),
607492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getLeftLoc(),
607592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             move_arg(Args),
607692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getRightLoc());
6077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6081454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
60821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6087454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
6088ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return SemaRef.Owned(E->Retain());
6089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
60921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6093454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
6094f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
6095f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6096f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6097f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6098f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor
6099f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // We don't need to transform the ivar; it will never change.
6100c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6101f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6102f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6103f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6104f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6105c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61069ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
6107f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->getLocation(),
6108f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->isArrow(), E->isFreeIvar());
6109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6113454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
6114e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // Transform the base expression.
6115e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6116e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (Base.isInvalid())
6117e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.ExprError();
6118c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6119e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // We don't need to transform the property; it will never change.
6120c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6121e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // If nothing changed, just retain the existing expression.
6122e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6123e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      Base.get() == E->getBase())
6124e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.Owned(E->Retain());
6125c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCPropertyRefExpr(Base.get(), E->getProperty(),
6127e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                 E->getLocation());
6128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
613209105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
6133454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
61349cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If this implicit setter/getter refers to class methods, it cannot have any
61359cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // dependent parts. Just retain the existing declaration.
61369cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (E->getInterfaceDecl())
61379cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6138c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61399cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // Transform the base expression.
61409cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
61419cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (Base.isInvalid())
61429cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.ExprError();
6143c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61449cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // We don't need to transform the getters/setters; they will never change.
6145c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61469cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If nothing changed, just retain the existing expression.
61479cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
61489cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor      Base.get() == E->getBase())
61499cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6150c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61519cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
61529cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getGetterMethod(),
61539cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getType(),
61549cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getSetterMethod(),
61559cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getLocation(),
61569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                             Base.get());
6157c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61611eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6162454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
6163ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // Can never occur in a dependent context.
61641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6169454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
6170f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
6171f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
6172f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6173f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.ExprError();
6174c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6175f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6176f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6177f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6178f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6179c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
6181f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                         E->isArrow());
6182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
61851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6186454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
6187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6188ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> SubExprs(SemaRef);
6189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
6190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
6191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
6192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
61931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
61959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    SubExprs.push_back(SubExpr.get());
6196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
61971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
62001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
62011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
6203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
6204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
6205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6209454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
6210a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  SourceLocation CaretLoc(E->getExprLoc());
6211a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6212a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  SemaRef.ActOnBlockStart(CaretLoc, /*Scope=*/0);
6213a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  BlockScopeInfo *CurBlock = SemaRef.getCurBlock();
6214a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  CurBlock->TheDecl->setIsVariadic(E->getBlockDecl()->isVariadic());
6215a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  llvm::SmallVector<ParmVarDecl*, 4> Params;
6216a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  llvm::SmallVector<QualType, 4> ParamTypes;
6217a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6218a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Parameter substitution.
6219a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  const BlockDecl *BD = E->getBlockDecl();
6220a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  for (BlockDecl::param_const_iterator P = BD->param_begin(),
6221a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian       EN = BD->param_end(); P != EN; ++P) {
6222a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParmVarDecl *OldParm = (*P);
6223a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParmVarDecl *NewParm = getDerived().TransformFunctionTypeParam(OldParm);
6224a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    QualType NewType = NewParm->getType();
6225a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    Params.push_back(NewParm);
6226a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParamTypes.push_back(NewParm->getType());
6227a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6228a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6229a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  const FunctionType *BExprFunctionType = E->getFunctionType();
6230a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  QualType BExprResultType = BExprFunctionType->getResultType();
6231a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!BExprResultType.isNull()) {
6232a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    if (!BExprResultType->isDependentType())
6233a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      CurBlock->ReturnType = BExprResultType;
6234a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    else if (BExprResultType != SemaRef.Context.DependentTy)
6235a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      CurBlock->ReturnType = getDerived().TransformType(BExprResultType);
6236a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6237a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6238a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Transform the body
6239a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  OwningStmtResult Body = getDerived().TransformStmt(E->getBody());
6240a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (Body.isInvalid())
6241a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.ExprError();
6242a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Set the parameters on the block decl.
6243a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!Params.empty())
6244a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    CurBlock->TheDecl->setParams(Params.data(), Params.size());
6245a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6246a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  QualType FunctionType = getDerived().RebuildFunctionProtoType(
6247a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        CurBlock->ReturnType,
6248a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        ParamTypes.data(),
6249a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        ParamTypes.size(),
6250a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        BD->isVariadic(),
6251fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                        0,
6252fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                               BExprFunctionType->getExtInfo());
6253a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6254a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  CurBlock->FunctionType = FunctionType;
62559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.ActOnBlockStmtExpr(CaretLoc, Body.get(), /*Scope=*/0);
6256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6260454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
6261a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  NestedNameSpecifier *Qualifier = 0;
6262a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6263a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  ValueDecl *ND
6264a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
6265a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                       E->getDecl()));
6266a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!ND)
6267a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.ExprError();
62682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
6269a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!getDerived().AlwaysRebuild() &&
6270a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      ND == E->getDecl()) {
6271a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // Mark it referenced in the new context regardless.
6272a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // FIXME: this is a bit instantiation-specific.
6273a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
6274a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6275a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.Owned(E->Retain());
6276a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6277a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
62782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation());
6279a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  return getDerived().RebuildDeclRefExpr(Qualifier, SourceLocation(),
62802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, 0);
6281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
6285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
628885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
628985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
62902865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildPointerType(PointeeType, Star,
6291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
6292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
629585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
629685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
62972865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Star,
6298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
6299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
63021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
630385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
630485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
630585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
63062865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
630785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
6308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
63101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
63111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
631285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
631385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
631485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
63152865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
631685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
6317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
6321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
6322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
6323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
6324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
6325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
6326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
6327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
6328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
6329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
6330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
63311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
63331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
63341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
63351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
6336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
6337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
6338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
6339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
6340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
6341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
6342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
6343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
63441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
63461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
6347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
63481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
6349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
6354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
6355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
635685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
635785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
63581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
635985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
6360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
6365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
636685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
636785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
63681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
636985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
6370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
6375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
63769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SizeExpr,
6377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
6378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
63791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
63809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
6381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63851eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
6387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
63889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Expr *SizeExpr,
6389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
6390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
63911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
63929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
6393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
6398788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                     unsigned NumElements,
6399788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                     VectorType::AltiVecSpecific AltiVecSpec) {
6400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
6401788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  return SemaRef.Context.getVectorType(ElementType, NumElements, AltiVecSpec);
6402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
6406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
6407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
6408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
6409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
6410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
64111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
6412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
64139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
6414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
64171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
64181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
64199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                           Expr *SizeExpr,
6420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
64219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
6422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
64261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
6427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
64281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
6429fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                          unsigned Quals,
6430fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                            const FunctionType::ExtInfo &Info) {
64311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
6432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
6433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
6434fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   getDerived().getBaseEntity(),
6435fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   Info);
6436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
6440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
6441a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
6442a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
6443a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
6444ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
6445ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
6446ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
6447ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
644892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // FIXME: Doesn't account for ObjCInterfaceDecl!
6449ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
6450ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
6451ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
6452ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
6453ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
6454ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6455ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
6456ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
6457ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
6458c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6459ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
6460ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
6461ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
6462ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
6463ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
6464ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6465ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
6466ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
6467ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6468ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
64699ae2f076ca5ab1feb3ba95629099ec2319833701John McCallQualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E) {
64709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildTypeofExprType(E);
6471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
6475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
6476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
64799ae2f076ca5ab1feb3ba95629099ec2319833701John McCallQualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E) {
64809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildDecltypeType(E);
6481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
6485833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
6486833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
6487d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
6488d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
6489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6491dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6492dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6493dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6494dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6495a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
6496c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
6497d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
6498dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
6499dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
6500dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
6501dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
6502dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
65031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
6504495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
6505c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
6506c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
650746646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
6508dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6509dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6511dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6512dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6513dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
6515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
6516dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6517dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6518dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6519dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6520dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6521dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6522dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
6523edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   QualType T) {
6524edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor  if (T->isDependentType() || T->isRecordType() ||
6525dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
6526a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6527dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
6528dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
6529dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
65301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
6532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
6533dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
65341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6535d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
65361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6537d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6538d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
6539d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
65401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
6541d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
6542d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
6543d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
6544d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
65451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6546d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
65473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
65483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
6549d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
6550d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
65511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
6552014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
6553014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
6554d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
6555d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6556d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6557d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
6558d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
6559d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       ObjectType.getAsOpaquePtr(),
6560d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
6561d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
6562d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
6563d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
65641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6566ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
6567ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6568ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
6569ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
6570ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
6571ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6572ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
6573ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
6574ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
6575ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
6576ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
6577d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
6578d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6579ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6580d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
6581d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
6582d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       ObjectType.getAsOpaquePtr(),
6583d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
6584d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
6585d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
6586ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
6587c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6588ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
65891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
6590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
6591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
65929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *OrigCallee,
65939ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *First,
65949ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *Second) {
65959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Callee = OrigCallee->IgnoreParenCasts();
65969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
65971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
6599f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
66009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
66019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType())
66029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinArraySubscriptExpr(First,
66039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Callee->getLocStart(),
66049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Second, OpLoc);
66051a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
66061a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
66079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc);
66089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  } else if (Second == 0 || isPostIncDec) {
66099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType()) {
6610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
6611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
66121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
6613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
66141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
6616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
66189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
66199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType()) {
6620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
6621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
6622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
66231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
66249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
6625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
6626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
66271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
6629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
6633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
66346e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
66351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
6637ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
6638ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
6639ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
6640ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
66416e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
6642ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
66439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl());
6644ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
66451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
66479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Args[2] = { First, Second };
66489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  unsigned NumArgs = 1 + (Second != 0);
66491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
6651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
66521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
6653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
66549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
6655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6657f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
66589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(),
6659ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
66609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      First,
66619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Second);
6662f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
6663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
66641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
6665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
66661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
6667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
6668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
6669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
66701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
6672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
667426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
6675c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntSema::OwningExprResult
66769ae2f076ca5ab1feb3ba95629099ec2319833701John McCallTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
667726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
667826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
667926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                 NestedNameSpecifier *Qualifier,
668026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceRange QualifierRange,
668126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
668226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
6683fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
6684a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
668526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  CXXScopeSpec SS;
668626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (Qualifier) {
668726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setRange(QualifierRange);
668826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setScopeRep(Qualifier);
668926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
669026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
66919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType BaseType = Base->getType();
66929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
669326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
6694c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      (isArrow && BaseType->getAs<PointerType>() &&
6695bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
6696bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
669726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
66989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
669926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
6700fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
6701a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
670226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
670326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
67042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
6705a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
67062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
67072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                 SemaRef.Context.getCanonicalType(DestroyedType->getType())));
67082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
67092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  NameInfo.setNamedTypeInfo(DestroyedType);
67102577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
671126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
67122577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
67139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getSema().BuildMemberReferenceExpr(Base, BaseType,
671426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
671526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
67162577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            NameInfo,
671726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
671826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
671926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
6720577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
6721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6722577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
6723