TreeTransform.h revision ab6677ec401cfd2c82b34e4cdfebd55a9dc25778
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
162d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h"
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h"
18dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
19781472fe99a120098c631b0cbe33c89f8cef5e70John McCall#include "clang/Sema/ScopeInfo.h"
20c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
217cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/DeclObjC.h"
22657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
23b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
24b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
28a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocBuilder.h"
2919510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Ownership.h"
3019510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Designator.h"
31b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
32a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "llvm/Support/ErrorHandling.h"
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
36781472fe99a120098c631b0cbe33c89f8cef5e70John McCallusing namespace sema;
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
39577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
67670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
7443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
89577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
90577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
91577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
92577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
95577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
96577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
10660d7b3a319d84d688752be3870615ac0f111fb16John McCall  static inline ExprResult Owned(Expr *E) { return E; }
10760d7b3a319d84d688752be3870615ac0f111fb16John McCall  static inline StmtResult Owned(Stmt *S) { return S; }
1089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall
109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, returns no source-location information. Subclasses can
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
1511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  DeclarationName Entity) : Self(Self) {
152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determine whether the given type \p T has already been
163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
1661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// to short-circuit evaluation when it is known that a given type will
167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// \brief Determine whether the given call argument should be dropped, e.g.,
1746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// because it is a default argument.
1756eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  ///
1766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// Subclasses can provide an alternative implementation of this routine to
1776eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// determine which kinds of call arguments get dropped. By default,
1786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  /// CXXDefaultArgument nodes are dropped (prior to transformation).
1796eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  bool DropCallArgument(Expr *E) {
1806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    return E->isDefaultArgument();
1816eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  }
182c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
185a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by creating a
186a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// TypeSourceInfo for it and delegating to the appropriate
187a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// function.  This is expensive, but we don't mind, because
188a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// this method is deprecated anyway;  all users should be
189a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// switched to storing TypeSourceInfos.
190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
192124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType TransformType(QualType T, QualType ObjectType = QualType());
1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
194a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transforms the given type-with-location into a new
195a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type-with-location.
196a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ///
197a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// By default, this routine transforms a type by delegating to the
198a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// appropriate TransformXXXType to build a new type.  Subclasses
199a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// may override this function (to take over all type
200a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// transformations) or some set of the TransformXXXType functions
201a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// to alter the transformation.
202c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  TypeSourceInfo *TransformType(TypeSourceInfo *DI,
203124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                QualType ObjectType = QualType());
204a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
205a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Transform the given type-with-location into a new
206a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// type, collecting location information in the given builder
207a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// as necessary.
208577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
209c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL,
210124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                         QualType ObjectType = QualType());
2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
212657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
21543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
21643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
21743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
21843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
21943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
22043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
22160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TransformStmt(Stmt *S);
2221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
223657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
224657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
23160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult TransformExpr(Expr *E);
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
236dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
237dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
2387c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *TransformDecl(SourceLocation Loc, Decl *D) { return D; }
23943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
24043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
24143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
24343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
244c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
245c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().TransformDecl(Loc, D);
2467c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  }
2471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2486cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// \brief Transform the given declaration, which was the first part of a
2496cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// nested-name-specifier in a member access expression.
2506cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
251c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// This specific declaration transformation only applies to the first
2526cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// identifier in a nested-name-specifier of a member access expression, e.g.,
2536cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// the \c T in \c x->T::member
2546cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  ///
2556cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
2566cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  /// Subclasses may override this function to provide alternate behavior.
257c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
258c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
2596cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  }
260c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
264dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
265dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
267a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
268c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
269c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
27281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
27381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
27481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
27581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
27681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
2772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo
2782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
2792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               QualType ObjectType = QualType());
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
283d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
285d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
293670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
294670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  ///
296833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// Returns true if there was an error.
297833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
298833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &Output);
299833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void InventTemplateArgumentLoc(const TemplateArgument &Arg,
302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                 TemplateArgumentLoc &ArgLoc);
303833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
304a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  /// \brief Fakes up a TypeSourceInfo for a type.
305a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *InventTypeSourceInfo(QualType T) {
306a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return SemaRef.Context.getTrivialTypeSourceInfo(T,
307833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                       getDerived().getBaseLocation());
308833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT)                                   \
312124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T, \
313124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType = QualType());
314a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms the parameters of a function type into the
31721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// given vectors.
31821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
31921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// The result vectors should be kept in sync; null entries in the
32021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// variables vector are acceptable.
32121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ///
32221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// Return true on error.
32321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  bool TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
32421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<QualType> &PTypes,
32521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                   llvm::SmallVectorImpl<ParmVarDecl*> &PVars);
32621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
32721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// \brief Transforms a single function-type parameter.  Return null
32821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  /// on error.
32921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm);
33021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
331c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL,
332124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                  QualType ObjectType);
33385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
334c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType
335dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor  TransformTemplateSpecializationType(const TemplateSpecializationType *T,
336dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor                                      QualType ObjectType);
337833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
33860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
33960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
34260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Transform##Node(Node *S);
343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
34460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Transform##Node(Node *E);
3457381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
3464bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
35285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
35885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
36085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \brief Build a new reference type given the type it references.
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// By default, performs semantic analysis when building the
36385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// reference type. Subclasses may override this routine to provide
36485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// different behavior.
365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
36685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// \param LValue whether the type was written with an lvalue sigil
36785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  /// or an rvalue sigil.
36885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildReferenceType(QualType ReferentType,
36985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                bool LValue,
37085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                SourceLocation Sigil);
3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
37785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
37885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceLocation Sigil);
3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(QualType ElementType,
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
40285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    unsigned IndexTypeQuals,
40385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    SourceRange BracketsRange);
404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
41285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      unsigned IndexTypeQuals,
41385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                      SourceRange BracketsRange);
414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new variable-length array type given the element type,
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
4229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SizeExpr,
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new dependent-sized array type given the element type,
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedArrayType(QualType ElementType,
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4339ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *SizeExpr,
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
44282287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
443788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    VectorType::AltiVecSpecific AltiVecSpec);
4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new potentially dependently-sized extended vector type
454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
4599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *SizeExpr,
460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
4611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
469fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    bool Variadic, unsigned Quals,
470fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                    const FunctionType::ExtInfo &Info);
4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
472a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  /// \brief Build a new unprototyped function type.
473a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType RebuildFunctionNoProtoType(QualType ResultType);
474a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
475ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// \brief Rebuild an unresolved typename type, given the decl that
476ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  /// the UnresolvedUsingTypenameDecl was transformed to.
477ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType RebuildUnresolvedUsingType(Decl *D);
478ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4937da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
4989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType RebuildTypeOfExprType(Expr *Underlying);
499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
5099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType RebuildDecltypeType(Expr *Underlying);
5101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
517833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateLoc,
518d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                       const TemplateArgumentListInfo &Args);
5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
522465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// By default, builds a new ElaboratedType type from the keyword,
523465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// the nested-name-specifier and the named type.
524465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  /// Subclasses may override this routine to provide different behavior.
525465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  QualType RebuildElaboratedType(ElaboratedTypeKeyword Keyword,
526465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                 NestedNameSpecifier *NNS, QualType Named) {
527465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, NNS, Named);
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
532e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// By default, builds a new DependentNameType type from the
533e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// nested-name-specifier and the given type. Subclasses may override
534e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// this routine to provide different behavior.
53533500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType RebuildDependentTemplateSpecializationType(
53633500955d731c73717af52088b7fc0e7a85681e7John McCall                                    ElaboratedTypeKeyword Keyword,
53733500955d731c73717af52088b7fc0e7a85681e7John McCall                                    NestedNameSpecifier *NNS,
53833500955d731c73717af52088b7fc0e7a85681e7John McCall                                    const IdentifierInfo *Name,
53933500955d731c73717af52088b7fc0e7a85681e7John McCall                                    SourceLocation NameLoc,
54033500955d731c73717af52088b7fc0e7a85681e7John McCall                                    const TemplateArgumentListInfo &Args) {
54133500955d731c73717af52088b7fc0e7a85681e7John McCall    // Rebuild the template name.
54233500955d731c73717af52088b7fc0e7a85681e7John McCall    // TODO: avoid TemplateName abstraction
54333500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateName InstName =
54433500955d731c73717af52088b7fc0e7a85681e7John McCall      getDerived().RebuildTemplateName(NNS, *Name, QualType());
54533500955d731c73717af52088b7fc0e7a85681e7John McCall
54696fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor    if (InstName.isNull())
54796fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor      return QualType();
54896fb42ea29253cf2b34848dfdb3e40ef14ca8ebcDouglas Gregor
54933500955d731c73717af52088b7fc0e7a85681e7John McCall    // If it's still dependent, make a dependent specialization.
55033500955d731c73717af52088b7fc0e7a85681e7John McCall    if (InstName.getAsDependentTemplateName())
55133500955d731c73717af52088b7fc0e7a85681e7John McCall      return SemaRef.Context.getDependentTemplateSpecializationType(
55233500955d731c73717af52088b7fc0e7a85681e7John McCall                                          Keyword, NNS, Name, Args);
55333500955d731c73717af52088b7fc0e7a85681e7John McCall
55433500955d731c73717af52088b7fc0e7a85681e7John McCall    // Otherwise, make an elaborated type wrapping a non-dependent
55533500955d731c73717af52088b7fc0e7a85681e7John McCall    // specialization.
55633500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType T =
55733500955d731c73717af52088b7fc0e7a85681e7John McCall      getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
55833500955d731c73717af52088b7fc0e7a85681e7John McCall    if (T.isNull()) return QualType();
559465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
56022f638a58ed05579c51ee6a35a1d16a7c2157f90Abramo Bagnara    // NOTE: NNS is already recorded in template specialization type T.
56122f638a58ed05579c51ee6a35a1d16a7c2157f90Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, /*NNS=*/0, T);
5621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
567e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  /// (or elaborated type). Subclasses may override this routine to provide
568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
569e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
5704a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    NestedNameSpecifier *NNS,
5714a2023f5014e82389d5980d307b89c545dbbac81Douglas Gregor                                    const IdentifierInfo *Id,
572e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation KeywordLoc,
573e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceRange NNSRange,
574e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                    SourceLocation IdLoc) {
5754033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    CXXScopeSpec SS;
5764033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SS.setScopeRep(NNS);
577e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    SS.setRange(NNSRange);
578e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara
5794033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (NNS->isDependent()) {
5804033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      // If the name is still dependent, just build a new dependent name type.
5814033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      if (!SemaRef.computeDeclContext(SS))
5824033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return SemaRef.Context.getDependentNameType(Keyword, NNS, Id);
5834033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
5844033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
585465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (Keyword == ETK_None || Keyword == ETK_Typename)
586e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return SemaRef.CheckTypenameType(Keyword, NNS, *Id,
587e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                       KeywordLoc, NNSRange, IdLoc);
588465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
589465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
590465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
591e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    // We had a dependent elaborated-type-specifier that has been transformed
5924033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // into a non-dependent elaborated-type-specifier. Find the tag we're
5934033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // referring to.
594e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
5954033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    DeclContext *DC = SemaRef.computeDeclContext(SS, false);
5964033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!DC)
5974033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
5984033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
5995613876991c80a684595fe8de1f039296a0657ffJohn McCall    if (SemaRef.RequireCompleteDeclContext(SS, DC))
6005613876991c80a684595fe8de1f039296a0657ffJohn McCall      return QualType();
6015613876991c80a684595fe8de1f039296a0657ffJohn McCall
6024033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    TagDecl *Tag = 0;
6034033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    SemaRef.LookupQualifiedName(Result, DC);
6044033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    switch (Result.getResultKind()) {
6054033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFound:
6064033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::NotFoundInCurrentInstantiation:
6074033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
608c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6094033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Found:
6104033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        Tag = Result.getAsSingle<TagDecl>();
6114033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        break;
612c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6134033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundOverloaded:
6144033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::FoundUnresolvedValue:
6154033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        llvm_unreachable("Tag lookup cannot find non-tags");
6164033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
617c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6184033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      case LookupResult::Ambiguous:
6194033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        // Let the LookupResult structure handle ambiguities.
6204033642464e8ba0982f88f34cffad808d247b393Douglas Gregor        return QualType();
6214033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6224033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6234033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    if (!Tag) {
6241eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor      // FIXME: Would be nice to highlight just the source range.
625e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
6261eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor        << Kind << Id << DC;
6274033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6284033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
629465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
630e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, IdLoc, *Id)) {
631e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
6324033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
6334033642464e8ba0982f88f34cffad808d247b393Douglas Gregor      return QualType();
6344033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    }
6354033642464e8ba0982f88f34cffad808d247b393Douglas Gregor
6364033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    // Build the elaborated-type-specifier type.
6374033642464e8ba0982f88f34cffad808d247b393Douglas Gregor    QualType T = SemaRef.Context.getTypeDeclType(Tag);
638465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    return SemaRef.Context.getElaboratedType(Keyword, NNS, T);
639dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
6401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
641dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
642dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
643dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
644dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
645dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
646dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
647dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
648dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
649a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
650c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
651c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
652dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
653dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
654dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
655dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
656dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
657dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
658dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
659dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
660dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
661dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
662dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
663dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
664dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
665dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
666dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
667dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
668dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
669dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
670dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
671dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
672edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  QualType T);
673d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
674d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
675d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
676d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
677d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
678d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
679d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
680d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
681d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
682d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
683d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
684d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
685d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
686d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
687d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
688d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
689d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
690d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
691d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
6923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
6933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
695ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// \brief Build a new template name given a nested name specifier and the
696ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// overloaded operator name that is referred to as a template.
697ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  ///
698ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// By default, performs semantic analysis to determine whether the name can
699ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
700ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// template name. Subclasses may override this routine to provide different
701ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  /// behavior.
702ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
703ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   OverloadedOperatorKind Operator,
704ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                   QualType ObjectType);
705c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
7149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
72260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
7239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *LHS,
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
7259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Expr *RHS,
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
7279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
7369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().ActOnCaseStmtBody(S, Body);
7379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return S;
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
74460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
7469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                      Stmt *SubStmt) {
7479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
75243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
75343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
75443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
75560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildLabelStmt(SourceLocation IdentLoc,
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
7589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Stmt *SubStmt) {
7599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, SubStmt);
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
76660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
7679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 VarDecl *CondVar, Stmt *Then,
7689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 SourceLocation ElseLoc, Stmt *Else) {
7699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
77343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
77443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
77543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
77660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
7779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *Cond, VarDecl *CondVar) {
7789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
779d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                            CondVar);
78043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
78243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
78343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
78443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
78543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
78660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
7879ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Stmt *Switch, Stmt *Body) {
7889ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
78943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
79043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
79143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
79243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
79343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
79443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
79560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
796eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                    Sema::FullExprArg Cond,
79799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                    VarDecl *CondVar,
7989ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Stmt *Body) {
7999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
80043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
80343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
80443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
80543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
80660d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
80743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
80843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
8099ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 Expr *Cond,
81043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
8119ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
8129ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 Cond, RParenLoc);
81343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
81443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
81543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
81643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
81743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
81843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
81960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildForStmt(SourceLocation ForLoc,
82043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
8219ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Stmt *Init, Sema::FullExprArg Cond,
82299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor                                  VarDecl *CondVar, Sema::FullExprArg Inc,
8239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  SourceLocation RParenLoc, Stmt *Body) {
8249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
825d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                  CondVar,
8269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Inc, RParenLoc, Body);
82743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
82943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
83043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
83143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
83243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
83360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildGotoStmt(SourceLocation GotoLoc,
83443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
83543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
83643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
83743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
83843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
83943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
84043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
84143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
84243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
84360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
84443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
8459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *Target) {
8469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
84743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
84943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
85043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
85143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
85243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
85360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
8549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *Result) {
8551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnReturnStmt(ReturnLoc, Result);
85743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
85943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
86043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
86143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
86243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
86360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
8641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
86543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
86643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
86743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
86843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
86943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
87043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
87143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
8721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
873703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// \brief Build a new inline asm statement.
874703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  ///
875703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// By default, performs semantic analysis to build the new statement.
876703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  /// Subclasses may override this routine to provide different behavior.
87760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildAsmStmt(SourceLocation AsmLoc,
878703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsSimple,
879703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool IsVolatile,
880703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumOutputs,
881703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  unsigned NumInputs,
882ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson                                  IdentifierInfo **Names,
883703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Constraints,
884703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Exprs,
8859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Expr *AsmString,
886703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  MultiExprArg Clobbers,
887703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  SourceLocation RParenLoc,
888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  bool MSAsm) {
889c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
890703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  NumInputs, Names, move(Constraints),
8919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                  Exprs, AsmString, Clobbers,
892703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson                                  RParenLoc, MSAsm);
893703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson  }
8944dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
8954dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @try statement.
8964dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
8974dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
8984dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
89960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
9009ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *TryBody,
9018f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor                                        MultiStmtArg CatchStmts,
9029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Stmt *Finally) {
9039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, move(CatchStmts),
9049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Finally);
9054dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
9064dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor
907be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Rebuild an Objective-C exception declaration.
908be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
909be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new declaration.
910be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
911be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
912be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                    TypeSourceInfo *TInfo, QualType T) {
913c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildObjCExceptionDecl(TInfo, T,
914c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                            ExceptionDecl->getIdentifier(),
915be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                            ExceptionDecl->getLocation());
916be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
917c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
918be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// \brief Build a new Objective-C @catch statement.
919be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  ///
920be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
921be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
92260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
923be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          SourceLocation RParenLoc,
924be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor                                          VarDecl *Var,
9259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Stmt *Body) {
926be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
9279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Var, Body);
928be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
929c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9304dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// \brief Build a new Objective-C @finally statement.
9314dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  ///
9324dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
9334dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
93460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
9359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Stmt *Body) {
9369ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
9374dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  }
938c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9398fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @throw statement.
940d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  ///
941d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// By default, performs semantic analysis to build the new statement.
942d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
94360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
9449ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                          Expr *Operand) {
9459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
946d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  }
947c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9488fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// \brief Build a new Objective-C @synchronized statement.
9498fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  ///
9508fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
9518fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
95260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
9539ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *Object,
9549ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Stmt *Body) {
9559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object,
9569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Body);
9578fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  }
958c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor
959c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// \brief Build a new Objective-C fast enumeration statement.
960c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  ///
961c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
962c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
96360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
964f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          SourceLocation LParenLoc,
965f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Stmt *Element,
966f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Expr *Collection,
967f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          SourceLocation RParenLoc,
968f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                          Stmt *Body) {
969c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor    return getSema().ActOnObjCForCollectionStmt(ForLoc, LParenLoc,
9709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Element,
9719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Collection,
972c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor                                                RParenLoc,
9739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                Body);
974c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  }
975c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
97643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
97743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
97843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
97943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
9801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
981a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *Declarator,
98243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
98343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
98443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
98643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
98743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
98843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
98943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
99043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
99143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
99243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
99360d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
994f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                 VarDecl *ExceptionDecl,
995f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                 Stmt *Handler) {
9969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
9979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Handler));
99843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
9991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
100043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
100143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
100243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
100343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
100460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
1005f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                               Stmt *TryBlock,
1006f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                               MultiStmtArg Handlers) {
10079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, move(Handlers));
100843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
10091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
101460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1015f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                        LookupResult &R,
1016f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                        bool RequiresADL) {
1017f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1018f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
1019f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1020f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1021f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// \brief Build a new expression that references a declaration.
1022f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  ///
1023f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// By default, performs semantic analysis to build the new expression.
1024f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  /// Subclasses may override this routine to provide different behavior.
102560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
1026f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                SourceRange QualifierRange,
1027f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                ValueDecl *VD,
1028f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                const DeclarationNameInfo &NameInfo,
1029f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                TemplateArgumentListInfo *TemplateArgs) {
1030a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    CXXScopeSpec SS;
1031a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setScopeRep(Qualifier);
1032a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    SS.setRange(QualifierRange);
1033dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall
1034dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall    // FIXME: loses template args.
10352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
10362577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
104360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
10459ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1048a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
10491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1050a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1051a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
105260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1053a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
1054a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
1055a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                NestedNameSpecifier *Qualifier,
105626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceRange QualifierRange,
105726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  TypeSourceInfo *ScopeType,
105826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                  SourceLocation CCLoc,
1059fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                  SourceLocation TildeLoc,
1060a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed);
10611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
10631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
106660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
10672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                        UnaryOperatorKind Opc,
10689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *SubExpr) {
10699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr);
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// \brief Build a new builtin offsetof expression.
10738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ///
10748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
10758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
107660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
10778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       TypeSourceInfo *Type,
1078f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                       Sema::OffsetOfComponent *Components,
10798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       unsigned NumComponents,
10808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                       SourceLocation RParenLoc) {
10818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
10828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                          NumComponents, RParenLoc);
10838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
1084c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
10861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
108960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildSizeOfAlignOf(TypeSourceInfo *TInfo,
10905ab75172051a6d2ea71a80a79e81c65519fd3462John McCall                                        SourceLocation OpLoc,
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
1092a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    return getSema().CreateSizeOfAlignOfExpr(TInfo, OpLoc, isSizeOf, R);
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
10951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
110060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildSizeOfAlignOf(Expr *SubExpr, SourceLocation OpLoc,
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
110260d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
11039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      = getSema().CreateSizeOfAlignOfExpr(SubExpr, OpLoc, isSizeOf, R);
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1105f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
11061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
111460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
11169ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *RHS,
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
11189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS,
11199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             LBracketLoc, RHS,
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
112760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
11319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc,
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
11361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
113960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
11401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
114183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
114283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
11432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                     const DeclarationNameInfo &MemberNameInfo,
1144f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                                     ValueDecl *Member,
11456bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                     NamedDecl *FoundDecl,
1146d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                        const TemplateArgumentListInfo *ExplicitTemplateArgs,
11478a4386b3634065b96d08f94736bc1f953e385f50Douglas Gregor                                     NamedDecl *FirstQualifierInScope) {
1148d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
1149d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
1150d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      if (getSema().PerformObjectMemberConversion(Base, Qualifier,
11536bb8017bb9e828d118e15e59d71c66bba323c364John McCall                                                  FoundDecl, Member))
1154f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
11558aa5f407d9e4787ff08bd66e1a2fe39be174fddcDouglas Gregor
11561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
11579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        new (getSema().Context) MemberExpr(Base, isArrow,
11582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                           Member, MemberNameInfo,
1159d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
1160d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
1161d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
11621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
116483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
116583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
116683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
116783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
116883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
11699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    getSema().DefaultFunctionArrayConversion(Base);
11709ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    QualType BaseType = Base->getType();
1171aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
11726bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // FIXME: this involves duplicating earlier analysis in a lot of
11736bb8017bb9e828d118e15e59d71c66bba323c364John McCall    // cases; we should avoid this when possible.
11742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
11756bb8017bb9e828d118e15e59d71c66bba323c364John McCall    R.addDecl(FoundDecl);
1176c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall    R.resolveKind();
1177c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
11789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1179129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, FirstQualifierInScope,
1180c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                              R, ExplicitTemplateArgs);
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
118760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
11882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall                                         BinaryOperatorKind Opc,
11899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *LHS, Expr *RHS) {
11909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS);
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
11941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
119760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildConditionalOperator(Expr *Cond,
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
11999ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *LHS,
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
12019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *RHS) {
12029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
12039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        LHS, RHS);
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
12071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
121060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
12119d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                         TypeSourceInfo *TInfo,
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
12139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         Expr *SubExpr) {
1214b042fdfc9460e0018276412257e3c3226f9ea96eJohn McCall    return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
12159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                         SubExpr);
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
12191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
122260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
122342f56b50062cd3b3c6b23fdb9053578ae9145664John McCall                                              TypeSourceInfo *TInfo,
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
12259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Init) {
122642f56b50062cd3b3c6b23fdb9053578ae9145664John McCall    return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
12279ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Init);
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
12311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
123460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildExtVectorElementExpr(Expr *Base,
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
1238aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
1239129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    CXXScopeSpec SS;
12402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
12419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1242129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              OpLoc, /*IsArrow*/ false,
1243129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              SS, /*FirstQualifierInScope*/ 0,
12442577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                              NameInfo,
1245129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              /* TemplateArgs */ 0);
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
125260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildInitList(SourceLocation LBraceLoc,
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1254e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   SourceLocation RBraceLoc,
1255e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor                                   QualType ResultTy) {
125660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
1257e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1258e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    if (Result.isInvalid() || ResultTy->isDependentType())
1259e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor      return move(Result);
1260c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1261e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // Patch in the result type we were given, which may have been computed
1262e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    // when the initial InitListExpr was built.
1263e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1264e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    ILE->setType(ResultTy);
1265e48319a8a901bc915d48d02b99c62e5f2589dbd9Douglas Gregor    return move(Result);
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
127260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
12769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *Init) {
127760d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
12799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Init);
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1281f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
12821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
12881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
129260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildImplicitValueInitExpr(QualType T) {
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
12971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
130060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
13019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Expr *SubExpr, TypeSourceInfo *TInfo,
13022cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    SourceLocation RParenLoc) {
13032cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara    return getSema().BuildVAArgExpr(BuiltinLoc,
13049ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    SubExpr, TInfo,
13052cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara                                    RParenLoc);
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
131260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1315c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().ActOnParenOrParenListExpr(LParenLoc, RParenLoc,
1316f88f7ab5adaa11d050270ffee6aa871e855f83b8Fariborz Jahanian                                               move(SubExprs));
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
13211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
132460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
13311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
133460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
13359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Stmt *SubStmt,
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
13379ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
134460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
13453fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TypeSourceInfo *TInfo1,
13463fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TypeSourceInfo *TInfo2,
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
13483fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara    return getSema().BuildTypesCompatibleExpr(BuiltinLoc,
13493fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara                                              TInfo1, TInfo2,
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
135760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
13589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                     Expr *Cond, Expr *LHS, Expr *RHS,
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
13619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                   Cond, LHS, RHS,
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
137360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
13759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Callee,
13769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *First,
13779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                              Expr *Second);
13781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
13831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
138560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
13889d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
13919ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
13959d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
13979ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
14009d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
14011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
14029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                    SubExpr, RParenLoc);
14031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
14059d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
14061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
14079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                        SubExpr,
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
14091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
14119d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
14121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
14139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr, RParenLoc);
14141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
14191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1420f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
142760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
14299d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                            TypeSourceInfo *TInfo,
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
14329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                            Expr *SubExpr,
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1434c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
14359ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1436c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1437c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
144460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
14469d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                             TypeSourceInfo *TInfo,
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
14499ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                             Expr *SubExpr,
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1451c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
14529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1453c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1454c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
146160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
14639d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                                 TypeSourceInfo *TInfo,
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
14669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SubExpr,
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1468c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
14699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1470c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1471c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
147860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
14809d125033a9853f3b572a4c9e2f9e2d4e5e346973John McCall                                           TypeSourceInfo *TInfo,
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
14839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Expr *SubExpr,
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1485c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall    return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
14869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       TInfo, SubExpr,
1487c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LAngleLoc, RAngleLoc),
1488c89724cc6dcb178ec79c76d7e629d9a7b5d83418John McCall                                       SourceRange(LParenLoc, RParenLoc));
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1495ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
1496ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          SourceLocation LParenLoc,
1497ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          Expr *Sub,
1498ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          SourceLocation RParenLoc) {
1499ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
1500f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                               MultiExprArg(&Sub, 1),
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
150860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
150957fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
151057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        TypeSourceInfo *Operand,
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1512c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
151357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
1514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
152060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
152157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                        SourceLocation TypeidLoc,
15229ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand,
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
15249ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
152557fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                    RParenLoc);
15261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
15271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
15311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
153360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1534828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      QualType ThisType,
1535828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                      bool isImplicit) {
1536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1537828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType,
1538828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor                                                          isImplicit));
1539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
154560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub) {
15469ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().ActOnCXXThrow(ThrowLoc, Sub);
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
155460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
1555036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                            ParmVarDecl *Param) {
1556036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc,
1557036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor                                                     Param));
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1564ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
1565ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation LParenLoc,
1566ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation RParenLoc) {
1567ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1569ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               RParenLoc);
1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
157660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
15771bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               bool UseGlobal,
15781bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation PlacementLParen,
15791bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               MultiExprArg PlacementArgs,
15801bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation PlacementRParen,
15811bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceRange TypeIdParens,
15821bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               QualType AllocatedType,
15831bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               TypeSourceInfo *AllocatedTypeInfo,
15841bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               Expr *ArraySize,
15851bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation ConstructorLParen,
15861bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               MultiExprArg ConstructorArgs,
15871bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                               SourceLocation ConstructorRParen) {
15881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
15924bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                 TypeIdParens,
15931bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                 AllocatedType,
15941bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                 AllocatedTypeInfo,
15959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                 ArraySize,
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
160560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
16089ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Expr *Operand) {
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
16109ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                    Operand);
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
16121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
161760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
16221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1623b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                         ParsedType::make(T), RParenLoc);
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
16261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
163160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildDependentScopeDeclRefExpr(NestedNameSpecifier *NNS,
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
16332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                       const DeclarationNameInfo &NameInfo,
1634f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1638f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
1639f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (TemplateArgs)
16402577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      return getSema().BuildQualifiedTemplateIdExpr(SS, NameInfo,
1641f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                    *TemplateArgs);
1642f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
16432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo);
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
165060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
1651f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         LookupResult &R,
1652f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                         bool RequiresADL,
1653d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                              const TemplateArgumentListInfo &TemplateArgs) {
1654f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getSema().BuildTemplateIdExpr(SS, R, RequiresADL, TemplateArgs);
1655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
166160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXConstructExpr(QualType T,
16624411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                           SourceLocation Loc,
1663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
16658c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           MultiExprArg Args,
16668c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           bool RequiresZeroInit,
16678c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                             CXXConstructExpr::ConstructionKind ConstructKind) {
1668ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall    ASTOwningVector<Expr*> ConvertedArgs(SemaRef);
1669c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc,
16704411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                          ConvertedArgs))
1671f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
1672c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
16734411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor    return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
16748c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           move_arg(ConvertedArgs),
16758c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                           RequiresZeroInit, ConstructKind);
1676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1682ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
1683ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation LParenLoc,
1684ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           MultiExprArg Args,
1685ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                           SourceLocation RParenLoc) {
1686ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo,
1687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1696ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
1697ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               SourceLocation LParenLoc,
1698ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               MultiExprArg Args,
1699ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                               SourceLocation RParenLoc) {
1700ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    return getSema().BuildCXXTypeConstructExpr(TSInfo,
1701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
17051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference 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.
171060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
1711aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  QualType BaseType,
1712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1714a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1715a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1716129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            NamedDecl *FirstQualifierInScope,
17172577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                   const DeclarationNameInfo &MemberNameInfo,
1718129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                              const TemplateArgumentListInfo *TemplateArgs) {
1719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1720a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1721a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
17221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
1724aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1725129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                            SS, FirstQualifierInScope,
17262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            MemberNameInfo,
17272577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            TemplateArgs);
1728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1730129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  /// \brief Build a new member reference expression.
17313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
17323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
17333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
173460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE,
1735aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                               QualType BaseType,
1736129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceLocation OperatorLoc,
1737129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               bool IsArrow,
1738129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               NestedNameSpecifier *Qualifier,
1739129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               SourceRange QualifierRange,
1740c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                               NamedDecl *FirstQualifierInScope,
1741129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                               LookupResult &R,
1742129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                const TemplateArgumentListInfo *TemplateArgs) {
17433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
17443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
17453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
1748aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                            OperatorLoc, IsArrow,
1749c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            SS, FirstQualifierInScope,
1750c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                            R, TemplateArgs);
17513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
17521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
175760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
175881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                         TypeSourceInfo *EncodeTypeInfo,
1759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
176081d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
1761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
17621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
176492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C class message.
176560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
176692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
176792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1768c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
176992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
177092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
177192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.BuildClassMessage(ReceiverTypeInfo,
177292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     ReceiverTypeInfo->getType(),
177392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     /*SuperLoc=*/SourceLocation(),
1774f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                     Sel, Method, LBracLoc, RBracLoc,
177592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                     move(Args));
177692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
177792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
177892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  /// \brief Build a new Objective-C instance message.
177960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCMessageExpr(Expr *Receiver,
178092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          Selector Sel,
178192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          ObjCMethodDecl *Method,
1782c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                          SourceLocation LBracLoc,
178392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          MultiExprArg Args,
178492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                          SourceLocation RBracLoc) {
17859ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildInstanceMessage(Receiver,
17869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        Receiver->getType(),
178792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        /*SuperLoc=*/SourceLocation(),
1788f49bb082ebf6413b2d3cb956e9c78dbb8a978c58Douglas Gregor                                        Sel, Method, LBracLoc, RBracLoc,
178992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                        move(Args));
179092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
179192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
1792f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C ivar reference expression.
1793f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1794f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1795f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
179660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
1797f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          SourceLocation IvarLoc,
1798f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                          bool IsArrow, bool IsFreeIvar) {
1799f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    // FIXME: We lose track of the IsFreeIvar bit.
1800f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
18019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1802f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc,
1803f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
180460d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1805f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IvarLoc,
1806d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0,
1807ad00b7705f9bbee81beeac428e7c6587734ab5a6John McCall                                                         false);
1808f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1809f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
1810c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1811f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1812f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1813c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
18149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1815c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IvarLoc, IsArrow, SS,
1816f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1817c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1818f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1819f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1820e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor
1821e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// \brief Build a new Objective-C property reference expression.
1822e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  ///
1823e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1824e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
182560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
1826e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              ObjCPropertyDecl *Property,
1827e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              SourceLocation PropertyLoc) {
1828e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    CXXScopeSpec SS;
18299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1830e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    LookupResult R(getSema(), Property->getDeclName(), PropertyLoc,
1831e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                   Sema::LookupMemberName);
1832e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    bool IsArrow = false;
183360d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1834e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                         /*FIME:*/PropertyLoc,
1835d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
1836e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.isInvalid())
1837f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
1838c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1839e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    if (Result.get())
1840e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      return move(Result);
1841c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
18429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1843c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/PropertyLoc, IsArrow,
1844c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              SS,
1845e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*FirstQualifierInScope=*/0,
1846c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1847e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                              /*TemplateArgs=*/0);
1848e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  }
1849c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1850c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// \brief Build a new Objective-C implicit setter/getter reference
18519cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// expression.
18529cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  ///
18539cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1854c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  /// Subclasses may override this routine to provide different behavior.
185560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCImplicitSetterGetterRefExpr(
18569cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Getter,
18579cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          QualType T,
18589cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        ObjCMethodDecl *Setter,
18599cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                        SourceLocation NameLoc,
18609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                          Expr *Base) {
18619cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // Since these expressions can only be value-dependent, we do not need to
18629cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    // perform semantic analysis again.
18639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return Owned(
18649cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
18659cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     Setter,
18669cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                                     NameLoc,
18679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                                     Base));
18689cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  }
18699cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor
1870f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// \brief Build a new Objective-C "isa" expression.
1871f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  ///
1872f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// By default, performs semantic analysis to build the new expression.
1873f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
187460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
1875f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                      bool IsArrow) {
1876f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    CXXScopeSpec SS;
18779ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Expr *Base = BaseArg;
1878f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc,
1879f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                   Sema::LookupMemberName);
188060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow,
1881f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                                         /*FIME:*/IsaLoc,
1882d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall                                                         SS, 0, false);
1883f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.isInvalid())
1884f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
1885c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1886f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    if (Result.get())
1887f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      return move(Result);
1888c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
18899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1890c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              /*FIXME:*/IsaLoc, IsArrow, SS,
1891f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*FirstQualifierInScope=*/0,
1892c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                              R,
1893f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                              /*TemplateArgs=*/0);
1894f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  }
1895c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
190060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
19041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
19091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
19121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
19140da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          BuiltinLoc);
1915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
19161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
19225291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor                                                   Builtin->getCallResultType(),
1923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
192460d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult OwnedCall(SemaRef.Owned(TheCall));
19251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
192760d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1929f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
19301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
19321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
193643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
193760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
193843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
193943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
19401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
194143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
194243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
19431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
194443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
194543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
194643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
194743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
19484bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
195043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
195143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
19527381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
195343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
19544bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
195543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
195660d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
195743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
1958f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
19591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19609ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().ActOnExprStmt(getSema().MakeFullExpr(E.take()));
196143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
19621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
19631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
196443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
196543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
19661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1968670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
196960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
1970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
19767381d5cfbd599fa2b9e215011ad7cbd449de231aSean Hunt#define ABSTRACT_STMT(Stmt)
1977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1978454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
19794bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
19801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
19811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1983657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1984657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1985657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1986dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1987dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1988a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1989c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1990c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
19910979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
19920979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
19931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1995dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1996dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
19971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1998c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1999c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
2000dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
2001dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
20021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
2004c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
2005a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
2006c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
2007dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2009dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
2010dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
20111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
2012a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
2013a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
2014a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
2015dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
2018a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
2019c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
2020c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
20211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2022dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
20231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
2024dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
20257c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                    getDerived().TransformDecl(Range.getBegin(),
20267c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       NNS->getAsNamespace()));
20271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
2028dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2029dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
2030dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2032dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
2033dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2035dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
2036dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
2037dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
2038dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2040dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
2041dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
2042fbf2c945f8f8bbfe0459d45c03f9ff34bb445c81Douglas Gregor    TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
2043124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0),
2044124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                            ObjectType);
2045d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
2046d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
20471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2048dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
2049dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
2050dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
2051dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
20521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
2055edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   T);
2056dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
2057dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
20581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2059dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
20601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
2061dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
2062dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
2063dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
20642577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclarationNameInfo
20652577743c5650c646fb705df01403707e94f2df04Abramo BagnaraTreeTransform<Derived>
20662577743c5650c646fb705df01403707e94f2df04Abramo Bagnara::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
20672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               QualType ObjectType) {
20682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name = NameInfo.getName();
206981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
20702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return DeclarationNameInfo();
207181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
207281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
207381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
207481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
207581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
207681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
207781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
20783e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  case DeclarationName::CXXLiteralOperatorName:
207981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
20802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NameInfo;
20811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
208281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
208381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
208481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
20852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    TypeSourceInfo *NewTInfo;
20862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    CanQualType NewCanTy;
20872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
20882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       NewTInfo = getDerived().TransformType(OldTInfo, ObjectType);
20892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       if (!NewTInfo)
20902577743c5650c646fb705df01403707e94f2df04Abramo Bagnara         return DeclarationNameInfo();
20912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
20922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
20932577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    else {
20942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewTInfo = 0;
20952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
20962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      QualType NewT = getDerived().TransformType(Name.getCXXNameType(),
20972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                 ObjectType);
20982577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      if (NewT.isNull())
20992577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        return DeclarationNameInfo();
21002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      NewCanTy = SemaRef.Context.getCanonicalType(NewT);
21012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    }
21021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationName NewName
21042577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
21052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                           NewCanTy);
21062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DeclarationNameInfo NewNameInfo(NameInfo);
21072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setName(NewName);
21082577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NewNameInfo.setNamedTypeInfo(NewTInfo);
21092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    return NewNameInfo;
211081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
21111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
21121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  assert(0 && "Unknown name kind.");
21142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return DeclarationNameInfo();
211581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
211681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
211781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
21181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
21193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
21203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
21217c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  SourceLocation Loc = getDerived().getBaseLocation();
21227c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor
2123d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
21241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2125d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
2126124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2127124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
2128d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
2129d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2131d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
21321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
21337c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2134d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
2135d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
21361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2137d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
2138d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
2139d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
2140d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
21411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2142d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
2143d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
2144d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
21451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2146f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // These should be getting filtered out before they make it into the AST.
2147f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    assert(false && "overloaded template name survived to here");
2148d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2150d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
21511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
2152d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
2153124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()),
2154124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  ObjectType);
21553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
2156d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2158d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2159dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        NNS == DTN->getQualifier() &&
2160dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor        ObjectType.isNull())
2161d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2163ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor    if (DTN->isIdentifier())
2164c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
2165ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                              ObjectType);
2166c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2167c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
2168ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            ObjectType);
2169d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2171d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
21721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
21737c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Loc, Template));
2174d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
2175d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
21761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2177d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2178d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
2179d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
21801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2181d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
2182d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
21831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2184f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // These should be getting filtered out before they reach the AST.
2185f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  assert(false && "overloaded function decl survived to here");
2186f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return TemplateName();
2187d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
2188d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
2189d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
2190833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallvoid TreeTransform<Derived>::InventTemplateArgumentLoc(
2191833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgument &Arg,
2192833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2193833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  SourceLocation Loc = getDerived().getBaseLocation();
2194670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
2195670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
21969f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin    llvm_unreachable("null template argument in TreeTransform");
2197833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2198833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2199833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Type:
2200833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg,
2201a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall               SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2202c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2203833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2204833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2205788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template:
2206788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(Arg, SourceRange(), Loc);
2207788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
2208c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2209833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
2210833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
2211833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2212833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2213833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
2214670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
2215833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
2216828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
2217833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    break;
2218833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
2219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
2220833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2221833ca991c1bfc967f0995974ca86f66ba1f666b5John McCalltemplate<typename Derived>
2222833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TreeTransform<Derived>::TransformTemplateArgument(
2223833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         const TemplateArgumentLoc &Input,
2224833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                         TemplateArgumentLoc &Output) {
2225833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateArgument &Arg = Input.getArgument();
2226833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Arg.getKind()) {
2227833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
2228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
2229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = Input;
2230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
22311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2232670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
2233a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    TypeSourceInfo *DI = Input.getTypeSourceInfo();
2234833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (DI == NULL)
2235a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall      DI = InventTypeSourceInfo(Input.getArgument().getAsType());
2236833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2237833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    DI = getDerived().TransformType(DI);
2238833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!DI) return true;
2239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2240833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
2241833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2242670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2244670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
2245833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    // FIXME: we should never have to transform one of these.
2246972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    DeclarationName Name;
2247972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor    if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
2248972e6ce33c7e307f4b0da12bd6079bbd6ef76948Douglas Gregor      Name = ND->getDeclName();
2249788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemporaryBase Rebase(*this, Input.getLocation(), Name);
22507c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    Decl *D = getDerived().TransformDecl(Input.getLocation(), Arg.getAsDecl());
2251833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!D) return true;
2252833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2253828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Expr *SourceExpr = Input.getSourceDeclExpression();
2254828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    if (SourceExpr) {
2255828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      EnterExpressionEvaluationContext Unevaluated(getSema(),
2256f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                                   Sema::Unevaluated);
225760d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult E = getDerived().TransformExpr(SourceExpr);
22589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      SourceExpr = (E.isInvalid() ? 0 : E.take());
2259828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    }
2260828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
2261828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
2262833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2263670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2265788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case TemplateArgument::Template: {
2266c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    TemporaryBase Rebase(*this, Input.getLocation(), DeclarationName());
2267788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    TemplateName Template
2268788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      = getDerived().TransformTemplateName(Arg.getAsTemplate());
2269788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    if (Template.isNull())
2270788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      return true;
2271c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2272788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    Output = TemplateArgumentLoc(TemplateArgument(Template),
2273788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateQualifierRange(),
2274788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor                                 Input.getTemplateNameLoc());
2275788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    return false;
2276788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  }
2277c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2278670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
2279670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
22801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
2281f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                                 Sema::Unevaluated);
22821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2283833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    Expr *InputExpr = Input.getSourceExpression();
2284833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2285833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
228660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult E
2287833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = getDerived().TransformExpr(InputExpr);
2288833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    if (E.isInvalid()) return true;
22899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take());
2290833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2291670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
22921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2293670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
2294670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2295670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
22961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
2297670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
2298670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
22991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // FIXME: preserve source information here when we start
2301833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      // caring about parameter packs.
2302833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2303828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc InputArg;
2304828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TemplateArgumentLoc OutputArg;
2305828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      getDerived().InventTemplateArgumentLoc(*A, InputArg);
2306828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
2307833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall        return true;
2308833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
2309828bff2079b6a91ecd7ed5b842c59527d7682789John McCall      TransformedArgs.push_back(OutputArg.getArgument());
2310670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
2311670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
23121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
2313670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
2314828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    Output = TemplateArgumentLoc(Result, Input.getLocInfo());
2315833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    return false;
2316670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
2317670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
23181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2319670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
2320833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return true;
2321670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
2322670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
2325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2328c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntQualType TreeTransform<Derived>::TransformType(QualType T,
2329124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
2331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
23321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2333a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Temporary workaround.  All of these transformations should
2334a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // eventually turn into transformations on TypeLocs.
2335a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  TypeSourceInfo *DI = getSema().Context.CreateTypeSourceInfo(T);
23364802a311f402836f1f226a3d7a87e6a3088f9704John McCall  DI->getTypeLoc().initialize(getDerived().getBaseLocation());
2337c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2338124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  TypeSourceInfo *NewDI = getDerived().TransformType(DI, ObjectType);
23391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2340a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (!NewDI)
2341a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
23421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2343a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return NewDI->getType();
2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2347124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI,
2348124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2349a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlreadyTransformed(DI->getType()))
2350a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return DI;
23511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2352a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLocBuilder TLB;
23531bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
2354a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeLoc TL = DI->getTypeLoc();
2355a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TLB.reserve(TL.getFullDataSize());
23561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2357124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, TL, ObjectType);
2358a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2359a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return 0;
23601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2361a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return TLB.getTypeSourceInfo(SemaRef.Context, Result);
2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2365a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2366124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas GregorTreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T,
2367124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2368a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  switch (T.getTypeLocClass()) {
2369a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define ABSTRACT_TYPELOC(CLASS, PARENT)
2370a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#define TYPELOC(CLASS, PARENT) \
2371a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  case TypeLoc::CLASS: \
2372124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor    return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T), \
2373124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2374a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall#include "clang/AST/TypeLocNodes.def"
2375a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
23779f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("unhandled type loc!");
2378a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return QualType();
2379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2381a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// FIXME: By default, this routine adds type qualifiers only to types
2382a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that can have qualifiers, and silently suppresses those qualifiers
2383a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// that are not permitted (e.g., qualifiers on reference or function
2384a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// types). This is the right thing for template instantiation, but
2385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall/// probably not for other clients.
23861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
23871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2388a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2389124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualifiedTypeLoc T,
2390124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
2391a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor  Qualifiers Quals = T.getType().getLocalQualifiers();
2392a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2393124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc(),
2394124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjectType);
2395a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
2396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2398a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Silently suppress qualifiers if the result type can't be qualified.
2399a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: this is the right thing for template instantiation, but
2400a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // probably not for other clients.
2401a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result->isFunctionType() || Result->isReferenceType())
2402a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return Result;
24031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24042865474261a608c7873b87ba4af110d17907896dJohn McCall  if (!Quals.empty()) {
24052865474261a608c7873b87ba4af110d17907896dJohn McCall    Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
24062865474261a608c7873b87ba4af110d17907896dJohn McCall    TLB.push<QualifiedTypeLoc>(Result);
24072865474261a608c7873b87ba4af110d17907896dJohn McCall    // No location information to preserve.
24082865474261a608c7873b87ba4af110d17907896dJohn McCall  }
2409a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate <class TyLoc> static inline
2414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2415a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TyLoc NewT = TLB.push<TyLoc>(T.getType());
2416a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewT.setNameLoc(T.getNameLoc());
2417a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return T.getType();
2418a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
2419a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2420a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2421a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2422124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      BuiltinTypeLoc T,
2423124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2424ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
2425ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  NewT.setBuiltinLoc(T.getBuiltinLoc());
2426ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  if (T.needsExtraLocalData())
2427ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
2428ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  return T.getType();
2429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2432a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2433124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      ComplexTypeLoc T,
2434124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2435a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: recurse?
2436a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, T);
2437a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
24381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2439a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2440a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2441c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                      PointerTypeLoc TL,
2442124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2443c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType PointeeType
2444c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
244592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (PointeeType.isNull())
244692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return QualType();
244792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
244892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  QualType Result = TL.getType();
2449c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  if (PointeeType->getAs<ObjCObjectType>()) {
245092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // A dependent pointer type 'T *' has is being transformed such
245192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // that an Objective-C class type is being replaced for 'T'. The
245292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // resulting pointer type is an ObjCObjectPointerType, not a
245392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // PointerType.
2454c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
2455c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2456c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
2457c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    NewT.setStarLoc(TL.getStarLoc());
245892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return Result;
245992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2460c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
246192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (getDerived().AlwaysRebuild() ||
246292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      PointeeType != TL.getPointeeLoc().getType()) {
246392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
246492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Result.isNull())
246592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return QualType();
246692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
2467c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
246892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
246992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2470c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Result;
2471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
24731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
24741eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2475a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2476124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  BlockPointerTypeLoc TL,
2477124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                  QualType ObjectType) {
2478db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  QualType PointeeType
2479c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    = getDerived().TransformType(TLB, TL.getPointeeLoc());
2480c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (PointeeType.isNull())
2481c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    return QualType();
2482c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2483c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  QualType Result = TL.getType();
2484c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (getDerived().AlwaysRebuild() ||
2485c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      PointeeType != TL.getPointeeLoc().getType()) {
2486c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    Result = getDerived().RebuildBlockPointerType(PointeeType,
2487db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor                                                  TL.getSigilLoc());
2488db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor    if (Result.isNull())
2489db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor      return QualType();
2490db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  }
2491db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor
249239968adc66ab02275d2f561e372a20ae454bd4e7Douglas Gregor  BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
2493db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  NewT.setSigilLoc(TL.getSigilLoc());
2494db93c4a8f839b2f46bfea66531aa014242f4da2cDouglas Gregor  return Result;
2495a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
24961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
249785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// Transforms a reference type.  Note that somewhat paradoxically we
249885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// don't care whether the type itself is an l-value type or an r-value
249985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// type;  we only care if the type was *written* as an l-value type
250085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall/// or an r-value type.
250185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCalltemplate<typename Derived>
250285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType
250385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2504124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ReferenceTypeLoc TL,
2505124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               QualType ObjectType) {
250685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  const ReferenceType *T = TL.getTypePtr();
250785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
250885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // Note that this works with the pointee-as-written.
250985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
251085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (PointeeType.isNull())
251185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    return QualType();
251285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
251385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  QualType Result = TL.getType();
251485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (getDerived().AlwaysRebuild() ||
251585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      PointeeType != T->getPointeeTypeAsWritten()) {
251685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildReferenceType(PointeeType,
251785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               T->isSpelledAsLValue(),
251885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                               TL.getSigilLoc());
251985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    if (Result.isNull())
252085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall      return QualType();
252185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  }
252285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
252385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  // r-value references can be rebuilt as l-value references.
252485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  ReferenceTypeLoc NewTL;
252585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  if (isa<LValueReferenceType>(Result))
252685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
252785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  else
252885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
252985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
253085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
253185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall  return Result;
253285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall}
253385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall
2534a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2535a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2536a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2537124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 LValueReferenceTypeLoc TL,
2538124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2539124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2540a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
25411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2542a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
2543a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2544a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2545124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 RValueReferenceTypeLoc TL,
2546124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2547124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor  return TransformReferenceType(TLB, TL, ObjectType);
2548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
25491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
25511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2552a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2553124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   MemberPointerTypeLoc TL,
2554124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2555a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerType *T = TL.getTypePtr();
2556a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2557a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2561a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // TODO: preserve source information for this.
2562a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ClassType
2563a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformType(QualType(T->getClass(), 0));
2564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2567a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2568a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2569a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      PointeeType != T->getPointeeType() ||
2570a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ClassType != QualType(T->getClass(), 0)) {
257185737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall    Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
257285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getStarLoc());
2573a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2574a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2575a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2577a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2578a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSigilLoc(TL.getSigilLoc());
2579a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2580a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
25831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
25841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2585a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2586124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ConstantArrayTypeLoc TL,
2587124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2588a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayType *T = TL.getTypePtr();
2589a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
25921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2593a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2594a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2595a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2596a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildConstantArrayType(ElementType,
2597a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
2598a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSize(),
259985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             T->getIndexTypeCVRQualifiers(),
260085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2601a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2602a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2603a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2604c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2605a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2606a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2607a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
26081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2609a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = TL.getSizeExpr();
2610a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Size) {
2611f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
2612a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2613a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2614a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2615a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2616a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2621a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                              TypeLocBuilder &TLB,
2622124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              IncompleteArrayTypeLoc TL,
2623124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                              QualType ObjectType) {
2624a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayType *T = TL.getTypePtr();
2625a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2629a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2630a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2631a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2632a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildIncompleteArrayType(ElementType,
2633a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                     T->getSizeModifier(),
263485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                           T->getIndexTypeCVRQualifiers(),
263585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                     TL.getBracketsRange());
2636a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2637a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2638a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2639c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2640a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2641a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2642a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2643a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(0);
2644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2645a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2649a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2650a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2651124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   VariableArrayTypeLoc TL,
2652124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
2653a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayType *T = TL.getTypePtr();
2654a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2658670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2659f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
2660670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
266160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SizeResult
2662a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2663a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Size = SizeResult.take();
2667a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2668a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2669a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2670a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2671a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2672a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildVariableArrayType(ElementType,
2673a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->getSizeModifier(),
26749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Size,
2675a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                             T->getIndexTypeCVRQualifiers(),
267685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   TL.getBracketsRange());
2677a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2678a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2680c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2681a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2682a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2683a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2684a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
26851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2686a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2687577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
26881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2690a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
2691a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2692124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                             DependentSizedArrayTypeLoc TL,
2693124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2694a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedArrayType *T = TL.getTypePtr();
2695a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2696577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2697577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
26981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2699670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2700f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
27011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
270260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SizeResult
2703a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    = getDerived().TransformExpr(T->getSizeExpr());
2704a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (SizeResult.isInvalid())
2705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2707a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  Expr *Size = static_cast<Expr*>(SizeResult.get());
2708a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2709a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2710a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2711a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType() ||
2712a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Size != T->getSizeExpr()) {
2713a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2714a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                         T->getSizeModifier(),
27159ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                         Size,
2716a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                T->getIndexTypeCVRQualifiers(),
271785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                        TL.getBracketsRange());
2718a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2719a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2720577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2721a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else SizeResult.take();
27221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2723a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // We might have any sort of array type now, but fortunately they
2724a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // all have the same location layout.
2725a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2726a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLBracketLoc(TL.getLBracketLoc());
2727a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRBracketLoc(TL.getRBracketLoc());
2728a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setSizeExpr(Size);
2729a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2730a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2735a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                      TypeLocBuilder &TLB,
2736124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      DependentSizedExtVectorTypeLoc TL,
2737124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                      QualType ObjectType) {
2738a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DependentSizedExtVectorType *T = TL.getTypePtr();
2739a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2740a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // FIXME: ext vector locs should be nested
2741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2742577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2743577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2745670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2746f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
2747670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
274860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2749577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
27511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2752a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2753a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2754eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      ElementType != T->getElementType() ||
2755eee91c3efbfc6a1509b42f39beb5533a9636fd70John McCall      Size.get() != T->getSizeExpr()) {
2756a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
27579ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                             Size.take(),
2758577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2759a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2760a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2761a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2762a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2763a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  // Result might be dependent or not.
2764a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (isa<DependentSizedExtVectorType>(Result)) {
2765a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    DependentSizedExtVectorTypeLoc NewTL
2766a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2767a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2768a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  } else {
2769a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2770a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setNameLoc(TL.getNameLoc());
2771a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2772a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2773a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2774577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2777a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2778124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     VectorTypeLoc TL,
2779124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2780a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2781577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2782577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2783577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2785a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2786a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2787a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
278882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
2789788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      T->getAltiVecSpecific());
2790a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2791a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2792a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2793c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2794a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2795a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
27961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2797a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2798577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
27991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2801a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2802124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        ExtVectorTypeLoc TL,
2803124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                        QualType ObjectType) {
2804a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  VectorType *T = TL.getTypePtr();
2805577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2807577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
28081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2809a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2810a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2811a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ElementType != T->getElementType()) {
2812a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildExtVectorType(ElementType,
2813a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               T->getNumElements(),
2814a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                               /*FIXME*/ SourceLocation());
2815a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2816a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2817a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2818c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2819a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2820a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
28211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2822a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2823577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
282621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallParmVarDecl *
282721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionTypeParam(ParmVarDecl *OldParm) {
282821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
282921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TypeSourceInfo *NewDI = getDerived().TransformType(OldDI);
283021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (!NewDI)
283121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return 0;
283221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
283321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  if (NewDI == OldDI)
283421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return OldParm;
283521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  else
283621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    return ParmVarDecl::Create(SemaRef.Context,
283721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getDeclContext(),
283821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getLocation(),
283921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getIdentifier(),
284021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI->getType(),
284121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               NewDI,
284221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               OldParm->getStorageClass(),
284316573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor                               OldParm->getStorageClassAsWritten(),
284421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                               /* DefArg */ NULL);
284521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
284621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
284721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
284821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallbool TreeTransform<Derived>::
284921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  TransformFunctionTypeParams(FunctionProtoTypeLoc TL,
285021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<QualType> &PTypes,
285121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                              llvm::SmallVectorImpl<ParmVarDecl*> &PVars) {
2852a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoType *T = TL.getTypePtr();
28531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2854a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2855a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *OldParm = TL.getArg(i);
2856a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2857a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    QualType NewType;
2858a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    ParmVarDecl *NewParm;
2859a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2860a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (OldParm) {
286121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      NewParm = getDerived().TransformFunctionTypeParam(OldParm);
286221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall      if (!NewParm)
286321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2864a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = NewParm->getType();
2865a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2866a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // Deal with the possibility that we don't have a parameter
2867a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    // declaration for this parameter.
2868a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    } else {
2869a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewParm = 0;
2870a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2871a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      QualType OldType = T->getArgType(i);
2872a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NewType = getDerived().TransformType(OldType);
2873a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      if (NewType.isNull())
287421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall        return true;
2875a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    }
28761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
287721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PTypes.push_back(NewType);
287821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall    PVars.push_back(NewParm);
2879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
28801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
288121ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  return false;
288221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall}
288321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall
288421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCalltemplate<typename Derived>
288521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallQualType
288621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
288721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   FunctionProtoTypeLoc TL,
288821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall                                                   QualType ObjectType) {
28897e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // Transform the parameters and return type.
28907e010a04fef171049291d8cb3047f118566da090Douglas Gregor  //
28917e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // We instantiate in source order, with the return type first followed by
28927e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // the parameters, because users tend to expect this (even if they shouldn't
28937e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // rely on it!).
28947e010a04fef171049291d8cb3047f118566da090Douglas Gregor  //
28957e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // FIXME: When we implement late-specified return types, we'll need to
28967e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // instantiate the return tpe *after* the parameter types in that case,
28977e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // since the return type can then refer to the parameters themselves (via
28987e010a04fef171049291d8cb3047f118566da090Douglas Gregor  // decltype, sizeof, etc.).
289921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<QualType, 4> ParamTypes;
290021ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall  llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2901895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  FunctionProtoType *T = TL.getTypePtr();
2902895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2903895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor  if (ResultType.isNull())
2904895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor    return QualType();
29057e010a04fef171049291d8cb3047f118566da090Douglas Gregor
29067e010a04fef171049291d8cb3047f118566da090Douglas Gregor  if (getDerived().TransformFunctionTypeParams(TL, ParamTypes, ParamDecls))
29077e010a04fef171049291d8cb3047f118566da090Douglas Gregor    return QualType();
2908c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2909a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2910a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2911a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType() ||
2912a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2913a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionProtoType(ResultType,
2914a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.data(),
2915a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   ParamTypes.size(),
2916a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                   T->isVariadic(),
2917fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getTypeQuals(),
2918fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                   T->getExtInfo());
2919a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2920a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2921a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
29221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2923a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2924a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2925a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2926a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2927a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    NewTL.setArg(i, ParamDecls[i]);
2928a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2929a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2934a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                 TypeLocBuilder &TLB,
2935124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 FunctionNoProtoTypeLoc TL,
2936124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 QualType ObjectType) {
2937a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoType *T = TL.getTypePtr();
2938a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2939a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (ResultType.isNull())
2940a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
2941a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2942a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2943a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2944a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      ResultType != T->getResultType())
2945a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2946a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2947a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2948a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
2949a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
2950a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2951a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
2952577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2954ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived> QualType
2955ed97649e9574b9d854fa4d6109c9333ae0993554John McCallTreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
2956124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                 UnresolvedUsingTypeLoc TL,
2957124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
2958ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  UnresolvedUsingType *T = TL.getTypePtr();
29597c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor  Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
2960ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (!D)
2961ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return QualType();
2962ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2963ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  QualType Result = TL.getType();
2964ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
2965ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Result = getDerived().RebuildUnresolvedUsingType(D);
2966ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (Result.isNull())
2967ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      return QualType();
2968ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
2969ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2970ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // We might get an arbitrary type spec type back.  We should at
2971ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  // least always get a type spec type, though.
2972ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
2973ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  NewTL.setNameLoc(TL.getNameLoc());
2974ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2975ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return Result;
2976ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
2977ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
2978577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2979a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2980124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypedefTypeLoc TL,
2981124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      QualType ObjectType) {
2982a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefType *T = TL.getTypePtr();
2983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
29847c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(TL.getNameLoc(),
29857c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           T->getDecl()));
2986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
29881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2989a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
2990a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
2991a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Typedef != T->getDecl()) {
2992a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildTypedefType(Typedef);
2993a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
2994a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
2995a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
2996a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
2997a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2998a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
29991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3000a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3004a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
3005124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                      TypeOfExprTypeLoc TL,
3006124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3007670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
3008f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
3011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3012577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
3013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3014a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3015a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3016cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      E.get() != TL.getUnderlyingExpr()) {
30179ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Result = getDerived().RebuildTypeOfExprType(E.get());
3018a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3019a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3021a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
30221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3023a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
3024cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3025cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3026cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3027a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3028a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3032a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
3033124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     TypeOfTypeLoc TL,
3034124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3035cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
3036cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
3037cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (!New_Under_TI)
3038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3040a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3041cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
3042cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
3043a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3044a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3045a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
30461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3047a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
3048cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setTypeofLoc(TL.getTypeofLoc());
3049cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setLParenLoc(TL.getLParenLoc());
3050cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setRParenLoc(TL.getRParenLoc());
3051cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  NewTL.setUnderlyingTInfo(New_Under_TI);
3052a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3053a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
30551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3057a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
3058124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       DecltypeTypeLoc TL,
3059124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3060a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeType *T = TL.getTypePtr();
3061a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3062670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
3063f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
30641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
306560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
3066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
3067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3069a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3070a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3071a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      E.get() != T->getUnderlyingExpr()) {
30729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Result = getDerived().RebuildDecltypeType(E.get());
3073a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3074a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
3076a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  else E.take();
3077a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3078a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
3079a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
30801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3081a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3085a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
3086124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     RecordTypeLoc TL,
3087124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                     QualType ObjectType) {
3088a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordType *T = TL.getTypePtr();
3089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
30907c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
30917c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                          T->getDecl()));
3092577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
3093577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
30941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3095a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3096a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3097a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Record != T->getDecl()) {
3098a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildRecordType(Record);
3099a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3100a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3101a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
31021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3103a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
3104a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
3105a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3106a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3110a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
3111124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   EnumTypeLoc TL,
3112124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3113a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumType *T = TL.getTypePtr();
3114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
31157c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
31167c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                        T->getDecl()));
3117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
3118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
31191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3120a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3121a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3122a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      Enum != T->getDecl()) {
3123a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    Result = getDerived().RebuildEnumType(Enum);
3124a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3125a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3126a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3127a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3128a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
3129a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  NewTL.setNameLoc(TL.getNameLoc());
31301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3131a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
31337da2431c23ef1ee8acb114e39692246e1801afc2John McCall
31343cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCalltemplate<typename Derived>
31353cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType TreeTransform<Derived>::TransformInjectedClassNameType(
31363cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         TypeLocBuilder &TLB,
31373cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         InjectedClassNameTypeLoc TL,
31383cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                         QualType ObjectType) {
31393cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
31403cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall                                       TL.getTypePtr()->getDecl());
31413cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  if (!D) return QualType();
31423cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31433cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
31443cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
31453cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  return T;
31463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
31473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
31481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
3151a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                                TypeLocBuilder &TLB,
3152124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                TemplateTypeParmTypeLoc TL,
3153124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                QualType ObjectType) {
3154a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
3155577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3156577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
31571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
315849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
3159a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall                                         TypeLocBuilder &TLB,
3160124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         SubstTemplateTypeParmTypeLoc TL,
3161124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                         QualType ObjectType) {
3162a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return TransformTypeSpecType(TLB, TL);
316349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
316449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
316549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
3166833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3167833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                      const TemplateSpecializationType *TST,
3168833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3169833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: this entire method is a temporary workaround; callers
3170833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // should be rewritten to provide real type locs.
3171a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3172833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // Fake up a TemplateSpecializationTypeLoc.
3173833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder TLB;
3174833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateSpecializationTypeLoc TL
3175833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
3176833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3177828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  SourceLocation BaseLoc = getDerived().getBaseLocation();
3178828bff2079b6a91ecd7ed5b842c59527d7682789John McCall
3179828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setTemplateNameLoc(BaseLoc);
3180828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setLAngleLoc(BaseLoc);
3181828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  TL.setRAngleLoc(BaseLoc);
3182833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
3183833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    const TemplateArgument &TA = TST->getArg(i);
3184833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateArgumentLoc TAL;
3185833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().InventTemplateArgumentLoc(TA, TAL);
3186833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TL.setArgLocInfo(i, TAL.getLocInfo());
3187833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
3188833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3189833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TypeLocBuilder IgnoredTLB;
3190833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
3191dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor}
3192c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3193dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregortemplate<typename Derived>
3194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
3195833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        TypeLocBuilder &TLB,
3196833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                           TemplateSpecializationTypeLoc TL,
3197833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                        QualType ObjectType) {
3198833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  const TemplateSpecializationType *T = TL.getTypePtr();
3199833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
3201dd62b15665a4144c45c1f7c53665414ad5f7f4f2Douglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
3202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
3203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
32041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3205d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo NewTemplateArgs;
3206d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
3207d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
3208d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
3209d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
3210d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
3211d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(i), Loc))
3212577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
3213d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    NewTemplateArgs.addArgument(Loc);
3214d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  }
32151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3216833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  // FIXME: maybe don't rebuild if all the template arguments are the same.
3217833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3218833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  QualType Result =
3219833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    getDerived().RebuildTemplateSpecializationType(Template,
3220833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                   TL.getTemplateNameLoc(),
3221d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NewTemplateArgs);
32221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3223833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  if (!Result.isNull()) {
3224833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    TemplateSpecializationTypeLoc NewTL
3225833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      = TLB.push<TemplateSpecializationTypeLoc>(Result);
3226833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
3227833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setLAngleLoc(TL.getLAngleLoc());
3228833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    NewTL.setRAngleLoc(TL.getRAngleLoc());
3229833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
3230833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
3231833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
32321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3233833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  return Result;
3234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3237a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3238465d41b92b2c862f3062c412a0538db65c6a2661Abramo BagnaraTreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
3239465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                ElaboratedTypeLoc TL,
3240465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                QualType ObjectType) {
3241465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedType *T = TL.getTypePtr();
3242465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
3243465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  NestedNameSpecifier *NNS = 0;
3244465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  // NOTE: the qualifier in an ElaboratedType is optional.
3245465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  if (T->getQualifier() != 0) {
3246465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    NNS = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3247e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                    TL.getQualifierRange(),
3248465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara                                                    ObjectType);
3249465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    if (!NNS)
3250465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      return QualType();
3251465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  }
32521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3253e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  QualType NamedT;
3254e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // FIXME: this test is meant to workaround a problem (failing assertion)
3255e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  // occurring if directly executing the code in the else branch.
3256e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (isa<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc())) {
3257e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc OldNamedTL
3258e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = cast<TemplateSpecializationTypeLoc>(TL.getNamedTypeLoc());
3259e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    const TemplateSpecializationType* OldTST
32609cbb4d81b98ee84795e267d51c1fa530ef6723bfJim Grosbach      = OldNamedTL.getType()->template getAs<TemplateSpecializationType>();
3261e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = TransformTemplateSpecializationType(OldTST, ObjectType);
3262e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3263e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3264e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    TemplateSpecializationTypeLoc NewNamedTL
3265e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
3266e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewNamedTL.copy(OldNamedTL);
3267e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3268e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  else {
3269e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
3270e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    if (NamedT.isNull())
3271e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      return QualType();
3272e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3273a63db84b164d3f1c987a3ea6251e3092db4f317bDaniel Dunbar
3274a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  QualType Result = TL.getType();
3275a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (getDerived().AlwaysRebuild() ||
3276a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      NNS != T->getQualifier() ||
3277e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      NamedT != T->getNamedType()) {
3278e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    Result = getDerived().RebuildElaboratedType(T->getKeyword(), NNS, NamedT);
3279a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    if (Result.isNull())
3280a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall      return QualType();
3281a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  }
3282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3283465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara  ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3284e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setKeywordLoc(TL.getKeywordLoc());
3285e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  NewTL.setQualifierRange(TL.getQualifierRange());
3286a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3287a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
32891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
32914714c12a1ab759156b78be8f109ea4c12213af57Douglas GregorQualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
32924714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor                                                       DependentNameTypeLoc TL,
3293124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
32944714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor  DependentNameType *T = TL.getTypePtr();
3295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
3296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
3297e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
3298e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                                                TL.getQualifierRange(),
3299edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                ObjectType);
3300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
3301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
33021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
330333500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result
330433500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().RebuildDependentNameType(T->getKeyword(), NNS,
330533500955d731c73717af52088b7fc0e7a85681e7John McCall                                            T->getIdentifier(),
330633500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getKeywordLoc(),
330733500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getQualifierRange(),
330833500955d731c73717af52088b7fc0e7a85681e7John McCall                                            TL.getNameLoc());
3309a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  if (Result.isNull())
3310a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall    return QualType();
3311a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
3312e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
3313e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    QualType NamedT = ElabT->getNamedType();
331433500955d731c73717af52088b7fc0e7a85681e7John McCall    TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
331533500955d731c73717af52088b7fc0e7a85681e7John McCall
3316e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
3317e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3318e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
331933500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3320e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
3321e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setKeywordLoc(TL.getKeywordLoc());
3322e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setQualifierRange(TL.getQualifierRange());
3323e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    NewTL.setNameLoc(TL.getNameLoc());
3324e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
3325a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return Result;
3326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
33271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
332933500955d731c73717af52088b7fc0e7a85681e7John McCallQualType TreeTransform<Derived>::
333033500955d731c73717af52088b7fc0e7a85681e7John McCall          TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
333133500955d731c73717af52088b7fc0e7a85681e7John McCall                                 DependentTemplateSpecializationTypeLoc TL,
333233500955d731c73717af52088b7fc0e7a85681e7John McCall                                                       QualType ObjectType) {
333333500955d731c73717af52088b7fc0e7a85681e7John McCall  DependentTemplateSpecializationType *T = TL.getTypePtr();
333433500955d731c73717af52088b7fc0e7a85681e7John McCall
333533500955d731c73717af52088b7fc0e7a85681e7John McCall  NestedNameSpecifier *NNS
333633500955d731c73717af52088b7fc0e7a85681e7John McCall    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
333733500955d731c73717af52088b7fc0e7a85681e7John McCall                                                TL.getQualifierRange(),
333833500955d731c73717af52088b7fc0e7a85681e7John McCall                                                ObjectType);
333933500955d731c73717af52088b7fc0e7a85681e7John McCall  if (!NNS)
334033500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
334133500955d731c73717af52088b7fc0e7a85681e7John McCall
334233500955d731c73717af52088b7fc0e7a85681e7John McCall  TemplateArgumentListInfo NewTemplateArgs;
334333500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
334433500955d731c73717af52088b7fc0e7a85681e7John McCall  NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
334533500955d731c73717af52088b7fc0e7a85681e7John McCall
334633500955d731c73717af52088b7fc0e7a85681e7John McCall  for (unsigned I = 0, E = T->getNumArgs(); I != E; ++I) {
334733500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateArgumentLoc Loc;
334833500955d731c73717af52088b7fc0e7a85681e7John McCall    if (getDerived().TransformTemplateArgument(TL.getArgLoc(I), Loc))
334933500955d731c73717af52088b7fc0e7a85681e7John McCall      return QualType();
335033500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTemplateArgs.addArgument(Loc);
335133500955d731c73717af52088b7fc0e7a85681e7John McCall  }
335233500955d731c73717af52088b7fc0e7a85681e7John McCall
335333500955d731c73717af52088b7fc0e7a85681e7John McCall  QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
335433500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getKeyword(),
335533500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NNS,
335633500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     T->getIdentifier(),
335733500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     TL.getNameLoc(),
335833500955d731c73717af52088b7fc0e7a85681e7John McCall                                                     NewTemplateArgs);
335933500955d731c73717af52088b7fc0e7a85681e7John McCall  if (Result.isNull())
336033500955d731c73717af52088b7fc0e7a85681e7John McCall    return QualType();
336133500955d731c73717af52088b7fc0e7a85681e7John McCall
336233500955d731c73717af52088b7fc0e7a85681e7John McCall  if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
336333500955d731c73717af52088b7fc0e7a85681e7John McCall    QualType NamedT = ElabT->getNamedType();
336433500955d731c73717af52088b7fc0e7a85681e7John McCall
336533500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the template specialization.
336633500955d731c73717af52088b7fc0e7a85681e7John McCall    TemplateSpecializationTypeLoc NamedTL
336733500955d731c73717af52088b7fc0e7a85681e7John McCall      = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
336833500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setLAngleLoc(TL.getLAngleLoc());
336933500955d731c73717af52088b7fc0e7a85681e7John McCall    NamedTL.setRAngleLoc(TL.getRAngleLoc());
337033500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I)
337133500955d731c73717af52088b7fc0e7a85681e7John McCall      NamedTL.setArgLocInfo(I, TL.getArgLocInfo(I));
337233500955d731c73717af52088b7fc0e7a85681e7John McCall
337333500955d731c73717af52088b7fc0e7a85681e7John McCall    // Copy information relevant to the elaborated type.
337433500955d731c73717af52088b7fc0e7a85681e7John McCall    ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
337533500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setKeywordLoc(TL.getKeywordLoc());
337633500955d731c73717af52088b7fc0e7a85681e7John McCall    NewTL.setQualifierRange(TL.getQualifierRange());
337733500955d731c73717af52088b7fc0e7a85681e7John McCall  } else {
3378e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TypeLoc NewTL(Result, TL.getOpaqueData());
3379e2872d0bda1d209d4409de2ed13648e6811628b7Douglas Gregor    TLB.pushFullCopy(NewTL);
338033500955d731c73717af52088b7fc0e7a85681e7John McCall  }
338133500955d731c73717af52088b7fc0e7a85681e7John McCall  return Result;
338233500955d731c73717af52088b7fc0e7a85681e7John McCall}
338333500955d731c73717af52088b7fc0e7a85681e7John McCall
338433500955d731c73717af52088b7fc0e7a85681e7John McCalltemplate<typename Derived>
3385a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3386a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
3387124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   ObjCInterfaceTypeLoc TL,
3388124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                   QualType ObjectType) {
3389ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCInterfaceType is never dependent.
3390c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3391c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return TL.getType();
3392c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3393c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
3394c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCalltemplate<typename Derived>
3395c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallQualType
3396c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
3397c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                ObjCObjectTypeLoc TL,
3398c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall                                                QualType ObjectType) {
3399c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  // ObjCObjectType is never dependent.
3400c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3401ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
3402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
34031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3405a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType
3406a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallTreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
3407124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                               ObjCObjectPointerTypeLoc TL,
3408124b878dba5007df0a268ea128a6ad8dc5dd2c5eDouglas Gregor                                                       QualType ObjectType) {
3409ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // ObjCObjectPointerType is never dependent.
3410c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  TLB.pushFullCopy(TL);
3411ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return TL.getType();
341224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
341324fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
3414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
341543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
341643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
341743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
341860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
34191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
34201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
342143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
342243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
342343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
342460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
342543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
342643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
342743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
342843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
342943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
343060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
34311eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
343243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
34337114cbab7eb6e8b714eb22f014327daf2c741c08John McCall  bool SubStmtInvalid = false;
343443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
3435ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Stmt*> Statements(getSema());
343643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
343743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
343860d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Result = getDerived().TransformStmt(*B);
34397114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    if (Result.isInvalid()) {
34407114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // Immediately fail if this was a DeclStmt, since it's very
34417114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // likely that this will cause problems for future statements.
34427114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      if (isa<DeclStmt>(*B))
34437114cbab7eb6e8b714eb22f014327daf2c741c08John McCall        return StmtError();
34447114cbab7eb6e8b714eb22f014327daf2c741c08John McCall
34457114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      // Otherwise, just keep processing substatements and fail later.
34467114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      SubStmtInvalid = true;
34477114cbab7eb6e8b714eb22f014327daf2c741c08John McCall      continue;
34487114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    }
34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
345043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
345143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
345243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
34531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34547114cbab7eb6e8b714eb22f014327daf2c741c08John McCall  if (SubStmtInvalid)
34557114cbab7eb6e8b714eb22f014327daf2c741c08John McCall    return StmtError();
34567114cbab7eb6e8b714eb22f014327daf2c741c08John McCall
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>
346860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
34691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
347060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS, RHS;
3471264c1f8ec895952466eab59b84b8b06801e721faEli Friedman  {
3472264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // The case value expressions are not potentially evaluated.
3473f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
34741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3475264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    // Transform the left-hand case value.
3476264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    LHS = getDerived().TransformExpr(S->getLHS());
3477264c1f8ec895952466eab59b84b8b06801e721faEli Friedman    if (LHS.isInvalid())
3478f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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())
3483f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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.
348960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult 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())
3495f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
349860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
349943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
3500f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
350760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
35081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
350943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
351060d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
351143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
3512f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
352060d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
35211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
352260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
352343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
3524f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
353360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
35341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
353543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
353660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult 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)
3545f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
354699e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
35478cfe5a784133d90bf329fd20801824a6f71bb8caDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3548c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
354999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
3550f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
3551eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
3552eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor    // Convert the condition to a boolean value.
3553afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
355460d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult CondE = getSema().ActOnBooleanCondition(0,
3555afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getIfLoc(),
35569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3557afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3558f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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())
3566f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
3567eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
356843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
356960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Then = getDerived().TransformStmt(S->getThen());
357043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
3571f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
35721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
357343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
357460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Else = getDerived().TransformStmt(S->getElse());
357543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
3576f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
359160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
35921eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
359343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
359460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult 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)
3603f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
360499e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
3605d3d5301c44138b92bf01286183f5bf310cdd37cfDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3606c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
360799e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
3608f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
360999e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  }
36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
361260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Switch
36139ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
3614586596fd7f7a336a2847b300c80614dcf39ab6d5Douglas Gregor                                          ConditionVar);
361543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
3616f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
36171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
361843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
361960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
362043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
3621f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
362960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
36301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
363143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
363260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult 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)
3641f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
364299e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
36435656e14d91405417182171a705ed3e3d2d6d7aa3Douglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3644c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
364599e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
3646f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
3647afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3648afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3649afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
365060d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult CondE = getSema().ActOnBooleanCondition(0,
3651eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor                                                             S->getWhileLoc(),
36529ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3653afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3654f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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())
3661f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
3662eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
366343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
366460d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
366543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
3666f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
367960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
368043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
368143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
368260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
368343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
3684f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
36851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3686eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  // Transform the condition
368760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(S->getCond());
3688eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor  if (Cond.isInvalid())
3689f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
370260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
370443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
370560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Init = getDerived().TransformStmt(S->getInit());
370643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
3707f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
37081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
370943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
371060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult 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)
3719f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
372099e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor  } else {
372199e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    Cond = getDerived().TransformExpr(S->getCond());
3722c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
372399e9b4d172f6877e6ba5ebe75bb8238721f5e01cDouglas Gregor    if (Cond.isInvalid())
3724f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
3725afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor
3726afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor    if (S->getCond()) {
3727afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      // Convert the condition to a boolean value.
372860d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult CondE = getSema().ActOnBooleanCondition(0,
3729afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor                                                               S->getForLoc(),
37309ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                               Cond.get());
3731afa0fefb573f74ac7836daf1601c214eda946212Douglas Gregor      if (CondE.isInvalid())
3732f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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())
3740f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
3741eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
374243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
374360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Inc = getDerived().TransformExpr(S->getInc());
374443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
3745f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
37461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Sema::FullExprArg FullInc(getSema().MakeFullExpr(Inc.get()));
37489ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (S->getInc() && !FullInc.get())
3749f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
3750eaa18e449bb09c1e580aa35f9606ff2ca682f4cbDouglas Gregor
375143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
375260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
375343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
3754f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
376960d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
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>
377760d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
377960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Target = getDerived().TransformExpr(S->getTarget());
378043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
3781f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
379260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
37941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
379543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
37961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
379743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
379860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
37991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
38001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
380143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
38021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
380343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
380460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
38051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
380660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Result = getDerived().TransformExpr(S->getRetValue());
380743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
3808f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
381660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
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)
3825f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
384160d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
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>
384860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
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
385560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult 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);
386960d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getDerived().TransformExpr(OutputExpr);
3870703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3871f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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);
388760d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Result = getDerived().TransformExpr(InputExpr);
3888703e39486689d6660e75f6b6de0068db031a51c7Anders Carlsson    if (Result.isInvalid())
3889f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
392260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
39231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
39244dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body of the @try.
392560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
39264dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (TryBody.isInvalid())
3927f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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) {
393360d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
39344dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Catch.isInvalid())
3935f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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).
394260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Finally;
39434dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (S->getFinallyStmt()) {
39444dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    Finally = getDerived().TransformStmt(S->getFinallyStmt());
39454dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor    if (Finally.isInvalid())
3946f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
396260d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
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)
3971f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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())
3980f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return StmtError();
3981be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    }
3982c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
3983be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
3984be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor    if (!Var)
3985f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
3986be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  }
3987c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
398860d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
3989be270a0fae647ae3fb4d6a21ba1ea5ab9c40853aDouglas Gregor  if (Body.isInvalid())
3990f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
399860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
39991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
40004dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  // Transform the body.
400160d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
40024dfdd1b5eb49999e3871f92310f2c53e1739f4f4Douglas Gregor  if (Body.isInvalid())
4003f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
401660d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
40171eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
401860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Operand;
4019d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor  if (S->getThrowExpr()) {
4020d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    Operand = getDerived().TransformExpr(S->getThrowExpr());
4021d1377b25a36adfe6604f78cbd3a23a07cf0f29e6Douglas Gregor    if (Operand.isInvalid())
4022f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
403360d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
403443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
40351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
40368fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the object we are locking.
403760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
40388fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Object.isInvalid())
4039f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
4040c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
40418fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  // Transform the body.
404260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
40438fdc13a78a43f09ac396e682c35d57ca0b48216dDouglas Gregor  if (Body.isInvalid())
4044f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
405860d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
405943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
40601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
4061c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the element statement.
406260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Element = getDerived().TransformStmt(S->getElement());
4063c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Element.isInvalid())
4064f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
4065c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4066c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the collection expression.
406760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Collection = getDerived().TransformExpr(S->getCollection());
4068c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Collection.isInvalid())
4069f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return StmtError();
4070c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
4071c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  // Transform the body.
407260d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(S->getBody());
4073c3203e7ee1464a096f341c2e2a83a10be2da000aDouglas Gregor  if (Body.isInvalid())
4074f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
409460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
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())
4105f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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())
4115f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return StmtError();
411643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
41171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
411843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
411960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
4120ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor  if (Handler.isInvalid())
4121f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
413460d7b3a319d84d688752be3870615ac0f111fb16John McCallStmtResult
413543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
413643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
413760d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult TryBlock
413843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
413943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
4140f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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) {
414660d7b3a319d84d688752be3870615ac0f111fb16John McCall    StmtResult Handler
414743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
414843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
4149f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
416860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4169454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
41701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
41711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
41721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
417460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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)
4181f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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)
4188f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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())
4194f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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))
4218f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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>
422860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4229454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
42301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
423460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4235454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
42361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
424060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4241454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
42421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
424660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4247454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
42481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
425260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4253454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
42541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
425860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4259454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
426060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4262f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
427260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4273454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
427460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4276f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
428760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
42888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorTreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
42898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  // Transform the type.
42908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
42918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (!Type)
4292f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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;
4301f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  typedef Sema::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());
431360d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Index = getDerived().TransformExpr(FromIndex);
43148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      if (Index.isInvalid())
4315f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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>
435360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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)
4360f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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
437060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult 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    //   [...]
4375f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
43761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4379f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
439160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4392454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
439360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4395f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
43961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
439760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
4398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4399f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
441460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4415454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
441760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4419f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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) {
442660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
4428f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
445360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4454454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
445560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4457f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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)
4465f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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)
4472f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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)
4481f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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))
4504f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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>
453260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4533454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
453460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
4535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4536f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
45371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
453860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
4539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4540f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
455260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
4554454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CompoundAssignOperator *E) {
4555454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformBinaryOperator(E);
4556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
45571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
455960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4560454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
456160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(E->getCond());
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4563f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
45641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
456560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
4566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4567f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
45681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
456960d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
4570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4571f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
458760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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>
459560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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)
4608f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
4609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
46101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
461160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
46126eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
4613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4614f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
462860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4629454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
463042f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *OldT = E->getTypeSourceInfo();
463142f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  TypeSourceInfo *NewT = getDerived().TransformType(OldT);
463242f56b50062cd3b3c6b23fdb9053578ae9145664John McCall  if (!NewT)
4633f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
46341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
463560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Init = getDerived().TransformExpr(E->getInitializer());
4636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4637f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
465460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4655454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
465660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
4657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4658f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
467360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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) {
467960d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Init = getDerived().TransformExpr(E->getInit(I));
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4681f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
469560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4696454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
46981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
469943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
470060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Init = getDerived().TransformExpr(E->getInit());
4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
4702f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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()) {
471860d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
4720f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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?");
473160d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Start
4732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
4734f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
47351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
473660d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
4738f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
476360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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())
4772f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
478260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4783454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
47849bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
47859bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo)
4786f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
47871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
478860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4790f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
480260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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) {
480760d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
4809f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
482660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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>
483360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4834454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
483560d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult SubStmt
4836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
4838f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
485060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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)
4857f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
48581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
48599bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  TInfo2 = getDerived().TransformType(E->getArgTInfo2());
48609bcd4d4a4b9281ba3526b0e86e6d422db93a9074Douglas Gregor  if (!TInfo2)
4861f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
487460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4875454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
487660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Cond = getDerived().TransformExpr(E->getCond());
4877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
4878f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
48791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
488060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult LHS = getDerived().TransformExpr(E->getLHS());
4881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
4882f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
48831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
488460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult RHS = getDerived().TransformExpr(E->getRHS());
4885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
4886f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
490060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
4901454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
49021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
490660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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");
4914f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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.
492160d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Object = getDerived().TransformExpr(E->getArg(0));
4922668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    if (Object.isInvalid())
4923f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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
493760d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Arg = getDerived().TransformExpr(E->getArg(I));
4938668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor      if (Arg.isInvalid())
4939f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return 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");
4965f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
4966668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
4967668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case OO_None:
4968668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  case NUM_OVERLOADED_OPERATORS:
4969668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor    llvm_unreachable("not an overloaded operator?");
4970f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
4971668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor  }
4972668d6d9dc100b3ef28a9b8e6fe987c2f5b6edcc9Douglas Gregor
497360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Callee = getDerived().TransformExpr(E->getCallee());
4974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
4975f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
49761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
497760d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult First = getDerived().TransformExpr(E->getArg(0));
4978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
4979f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
4980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
498160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Second;
4982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
4983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
4984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
4985f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return 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>
500260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5003454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
5004454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCallExpr(E);
5005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
500860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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)
5021f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
502460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
50256eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5027f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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>
505260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5053454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
5054454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
505860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5059454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
5060454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
506460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
5066454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                      CXXReinterpretCastExpr *E) {
5067454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
507160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5072454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
5073454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall  return getDerived().TransformCXXNamedCastExpr(E);
5074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
50751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
507760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
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)
5088f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
50901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
509160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr
50926eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    = getDerived().TransformExpr(E->getSubExprAsWritten());
5093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5094f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return 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
5101ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(NewT,
5102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
51039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   SubExpr.get(),
5104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
5105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
510860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5109454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
5110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
511157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    TypeSourceInfo *TInfo
511257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor      = getDerived().TransformType(E->getTypeOperandSourceInfo());
511357fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    if (!TInfo)
5114f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
51151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
511757fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor        TInfo == E->getTypeOperandSourceInfo())
5118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
51191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
512057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getType(),
512157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             E->getLocStart(),
512257fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                             TInfo,
5123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
5124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
51251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
5127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
5128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
51291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
5130f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall                                      Sema::PotentiallyPotentiallyEvaluated);
51311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
513260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
5133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5134f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
51351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
51381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
51391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
514057fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getType(),
514157fdc8a4382164955c7b30d09f4ce46fc7e67659Douglas Gregor                                           E->getLocStart(),
51429ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           SubExpr.get(),
5143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
5144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
514760d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5148454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
51491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
515360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
5155454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXNullPtrLiteralExpr *E) {
51561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
516060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5161454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
5162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
51631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5166f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
51671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
5170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
51711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5172828a197317288e3333b0ce6f5cedadd036e3531fDouglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
5173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
517660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5177454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
517860d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
5179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
5180f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
51811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
51841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
51869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get());
5187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
51881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
519060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5191454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
51921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
51937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
51947c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           E->getParam()));
5195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
5196f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
51971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
519853cb6f82c41397917b14fb8cdcb32e6c9bd07655Chandler Carruth  if (!getDerived().AlwaysRebuild() &&
5199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
5200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
52011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5202036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
5203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
520660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5207ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas GregorTreeTransform<Derived>::TransformCXXScalarValueInitExpr(
5208ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                                    CXXScalarValueInitExpr *E) {
5209ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
5210ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
5211f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
5212ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
5213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5214ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo())
52151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
52161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5217ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXScalarValueInitExpr(T,
5218ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          /*FIXME:*/T->getTypeLoc().getEndLoc(),
5219ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor                                                    E->getRParenLoc());
5220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
52211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
522360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5224454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
5225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
52261bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  TypeSourceInfo *AllocTypeInfo
52271bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor    = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
52281bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  if (!AllocTypeInfo)
5229f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
52301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
523260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
5233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
5234f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
52351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
5237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5238ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> PlacementArgs(SemaRef);
5239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
524060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
5241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5242f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
52431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
5245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
5246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
524843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
5249ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> ConstructorArgs(SemaRef);
5250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
5251ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor    if (getDerived().DropCallArgument(E->getConstructorArg(I)))
5252ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor      break;
5253ff2e4f44e56aef84fa423af4ca5c1fe56886b4aaDouglas Gregor
525460d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
5255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
5256f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
52571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
5259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
5260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
52611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform constructor, new operator, and delete operator.
52631af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  CXXConstructorDecl *Constructor = 0;
52641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getConstructor()) {
52651af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    Constructor = cast_or_null<CXXConstructorDecl>(
52667c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52677c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
52681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!Constructor)
5269f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
52701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorNew = 0;
52731af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorNew()) {
52741af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorNew = cast_or_null<FunctionDecl>(
52757c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(E->getLocStart(),
52767c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getOperatorNew()));
52771af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorNew)
5278f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
52791af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
52801af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor
52811af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
52821af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
52831af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
52847c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
52857c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
52861af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
5287f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
52881af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5289c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
52911bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor      AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
5292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
52931af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Constructor == E->getConstructor() &&
52941af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorNew == E->getOperatorNew() &&
52951af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete() &&
52961af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      !ArgumentChanged) {
52971af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
52981af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
52991af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (Constructor)
53001af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
53011af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorNew)
53021af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorNew);
53031af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53041af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53061af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53081bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  QualType AllocType = AllocTypeInfo->getType();
53095b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  if (!ArraySize.get()) {
53105b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // If no array size was specified, but the new expression was
53115b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with an array type (e.g., "new T" where T is
53125b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // instantiated with "int[4]"), extract the outer bound from the
53135b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // array type as our array size. We do this with constant and
53145b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    // dependently-sized array types.
53155b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
53165b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    if (!ArrayT) {
53175b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      // Do nothing
53185b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const ConstantArrayType *ConsArrayT
53195b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                                     = dyn_cast<ConstantArrayType>(ArrayT)) {
5320c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      ArraySize
53219996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis        = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context,
53229996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               ConsArrayT->getSize(),
53239996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               SemaRef.Context.getSizeType(),
53249996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                                               /*FIXME:*/E->getLocStart()));
53255b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      AllocType = ConsArrayT->getElementType();
53265b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    } else if (const DependentSizedArrayType *DepArrayT
53275b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor                              = dyn_cast<DependentSizedArrayType>(ArrayT)) {
53285b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      if (DepArrayT->getSizeExpr()) {
53295b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()->Retain());
53305b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor        AllocType = DepArrayT->getElementType();
53315b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor      }
53325b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor    }
53335b5ad8453c8e79f642c3ddfeeadf162ae67309c0Douglas Gregor  }
53341bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor
5335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
5336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
5337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
5339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
53404bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor                                        E->getTypeIdParens(),
5341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
53421bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor                                        AllocTypeInfo,
53439ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                        ArraySize.get(),
5344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
5345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
53461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
5347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
535060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5351454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
535260d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Operand = getDerived().TransformExpr(E->getArgument());
5353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
5354f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
53551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
53561af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  // Transform the delete operator, if known.
53571af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  FunctionDecl *OperatorDelete = 0;
53581af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  if (E->getOperatorDelete()) {
53591af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    OperatorDelete = cast_or_null<FunctionDecl>(
53607c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                   getDerived().TransformDecl(E->getLocStart(),
53617c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                       E->getOperatorDelete()));
53621af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (!OperatorDelete)
5363f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
53641af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
5365c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
53671af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      Operand.get() == E->getArgument() &&
53681af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      OperatorDelete == E->getOperatorDelete()) {
53691af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark any declarations we need as referenced.
53701af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: instantiation-specific.
53711af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    if (OperatorDelete)
53721af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor      SemaRef.MarkDeclarationReferenced(E->getLocStart(), OperatorDelete);
53731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
53741af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor  }
53751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
5377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
5378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
53799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                           Operand.get());
5380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
53811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
538360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5384a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
5385454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                     CXXPseudoDestructorExpr *E) {
538660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
5387a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
5388f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
53891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5390b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  ParsedType ObjectTypePtr;
5391a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  bool MayBePseudoDestructor = false;
53929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
5393a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              E->getOperatorLoc(),
5394a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        E->isArrow()? tok::arrow : tok::period,
5395a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              ObjectTypePtr,
5396a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              MayBePseudoDestructor);
5397a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (Base.isInvalid())
5398f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
5399c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5400b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  QualType ObjectType = ObjectTypePtr.get();
5401a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
5402a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5403b10cd04880672103660e5844e51ee91af7361a20Douglas Gregor                                                E->getQualifierRange(),
5404a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                ObjectType);
5405a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
5406f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
54071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5408a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  PseudoDestructorTypeStorage Destroyed;
5409a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (E->getDestroyedTypeInfo()) {
5410a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    TypeSourceInfo *DestroyedTypeInfo
5411a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = getDerived().TransformType(E->getDestroyedTypeInfo(), ObjectType);
5412a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!DestroyedTypeInfo)
5413f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5414a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = DestroyedTypeInfo;
5415a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else if (ObjectType->isDependentType()) {
5416a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // We aren't likely to be able to resolve the identifier down to a type
5417a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // now anyway, so just retain the identifier.
5418a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
5419a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                            E->getDestroyedTypeLoc());
5420a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  } else {
5421a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    // Look for a destructor known with the given name.
5422a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    CXXScopeSpec SS;
5423a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (Qualifier) {
5424a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setScopeRep(Qualifier);
5425a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      SS.setRange(E->getQualifierRange());
5426a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    }
5427c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5428b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
5429a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                              *E->getDestroyedTypeIdentifier(),
5430a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                E->getDestroyedTypeLoc(),
5431a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                /*Scope=*/0,
5432a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                SS, ObjectTypePtr,
5433a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                false);
5434a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    if (!T)
5435f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5436c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5437a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    Destroyed
5438a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor      = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
5439a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                 E->getDestroyedTypeLoc());
5440a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  }
544126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
544226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  TypeSourceInfo *ScopeTypeInfo = 0;
544326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (E->getScopeTypeInfo()) {
5444c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    ScopeTypeInfo = getDerived().TransformType(E->getScopeTypeInfo(),
5445a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                               ObjectType);
544626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    if (!ScopeTypeInfo)
5447f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5448a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
5449c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
54509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
5451a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
5452a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
5453a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
545426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getQualifierRange(),
545526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     ScopeTypeInfo,
545626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     E->getColonColonLoc(),
5457fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                     E->getTildeLoc(),
5458a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                                     Destroyed);
5459a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
54601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5461a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
546260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5463ba13543329afac4a0d01304ec2ec4924d99306a6John McCallTreeTransform<Derived>::TransformUnresolvedLookupExpr(
5464454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  UnresolvedLookupExpr *Old) {
5465f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemporaryBase Rebase(*this, Old->getNameLoc(), DeclarationName());
5466f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5467f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
5468f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                 Sema::LookupOrdinaryName);
5469f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5470f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Transform all the decls.
5471f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
5472f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall         E = Old->decls_end(); I != E; ++I) {
54737c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
54747c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                 getDerived().TransformDecl(Old->getNameLoc(),
54757c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                            *I));
54769f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
54779f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
54789f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
54799f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
54809f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
54819f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
5482f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
54839f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5484f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5485f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    // Expand using declarations.
5486f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (isa<UsingDecl>(InstD)) {
5487f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5488f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5489f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall             E = UD->shadow_end(); I != E; ++I)
5490f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        R.addDecl(*I);
5491f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      continue;
5492f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    }
5493f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5494f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    R.addDecl(InstD);
5495f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5496f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5497f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Resolve a kind, but don't do any further analysis.  If it's
5498f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // ambiguous, the callee needs to deal with it.
5499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  R.resolveKind();
5500f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5501f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // Rebuild the nested-name qualifier, if present.
5502f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  CXXScopeSpec SS;
5503f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  NestedNameSpecifier *Qualifier = 0;
5504f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Old->getQualifier()) {
5505f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    Qualifier = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5506edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                    Old->getQualifierRange());
5507f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!Qualifier)
5508f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5509c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5510f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setScopeRep(Qualifier);
5511f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    SS.setRange(Old->getQualifierRange());
5512c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  }
5513c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5514c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  if (Old->getNamingClass()) {
551566c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    CXXRecordDecl *NamingClass
551666c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
551766c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                            Old->getNameLoc(),
551866c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
551966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
5520f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5521c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
552266c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5523f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5524f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5525f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have no template arguments, it's a normal declaration name.
5526f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!Old->hasExplicitTemplateArgs())
5527f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
5528f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5529f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // If we have template arguments, rebuild them, then rebuild the
5530f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  // templateid expression.
5531f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
5532f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5533f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TemplateArgumentLoc Loc;
5534f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I], Loc))
5535f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5536f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    TransArgs.addArgument(Loc);
5537f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  }
5538f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall
5539f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildTemplateIdExpr(SS, R, Old->requiresADL(),
5540f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                            TransArgs);
5541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
554460d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5545454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
5546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
55471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
5549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5550f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
55511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
5554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
55551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
5557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
5558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
55591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
5561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
5562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
5563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
5564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
5565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
55661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
556860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5569865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
55702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                               DependentScopeDeclRefExpr *E) {
5571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
5572f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5573edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                E->getQualifierRange());
5574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
5575f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
55761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
55782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
55792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
5580f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
55811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5582f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (!E->hasExplicitTemplateArgs()) {
5583f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    if (!getDerived().AlwaysRebuild() &&
5584f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall        NNS == E->getQualifier() &&
55852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // Note: it is sufficient to compare the Name component of NameInfo:
55862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        // if name has not changed, DNLoc has not changed either.
55872577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getDeclName())
5588f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall      return SemaRef.Owned(E->Retain());
55891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5590f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5591f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         E->getQualifierRange(),
55922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                         NameInfo,
5593f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                         /*TemplateArgs*/ 0);
5594f17bb74e74aca9bb0525d2249041ab65c7d1fd48Douglas Gregor  }
5595d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
5596d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
5597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5598d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5599d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5600f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5601d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
5602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5604f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  return getDerived().RebuildDependentScopeDeclRefExpr(NNS,
5605f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       E->getQualifierRange(),
56062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
5607f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                       &TransArgs);
5608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
561160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5612454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
5613321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // CXXConstructExprs are always implicit, so when we have a
5614321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  // 1-argument construction we just transform that argument.
5615321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor  if (E->getNumArgs() == 1 ||
5616321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor      (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1))))
5617321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor    return getDerived().TransformExpr(E->getArg(0));
5618321725d95d331d1612ac386d7d4235eca94b0021Douglas Gregor
5619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
5620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
5622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
5623f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
5624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
56277c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(E->getLocStart(),
56287c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5630f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
56311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5633ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
56341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
5635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
5636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
56376eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
56386eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      ArgumentChanged = true;
56396eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      break;
56406eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    }
56416eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
564260d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult TransArg = getDerived().TransformExpr(*Arg);
5643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5644f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
56451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
56479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(TransArg.get());
5648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
5649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
5652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
5653c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor      !ArgumentChanged) {
56541af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // Mark the constructor as referenced.
56551af745143eb3066660d8855c17ccec6b38f5d789Douglas Gregor    // FIXME: Instantiation-specific
5656c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
5658c845aad6f7d012ab0cd0a040515ab512d1a93566Douglas Gregor  }
56591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56604411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
56614411d2e674b0119f682ac472c3a377f14fa9fa30Douglas Gregor                                              Constructor, E->isElidable(),
56628c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              move_arg(Args),
56638c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              E->requiresZeroInitialization(),
56648c3e554d00d456d5093c21ce8a0c205461279aabDouglas Gregor                                              E->getConstructionKind());
5665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
5668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56695132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
56705132655e4296b780672e9a96b46a740135073534Douglas Gregor/// transform the subexpression and return that.
5671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
567260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5673454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
56745132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
5678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
5679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
56805132655e4296b780672e9a96b46a740135073534Douglas Gregor/// Since CXXExprWithTemporaries nodes are implicitly generated, we
56815132655e4296b780672e9a96b46a740135073534Douglas Gregor/// just transform the subexpression and return that.
5682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
568360d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
56855132655e4296b780672e9a96b46a740135073534Douglas Gregor                                                    CXXExprWithTemporaries *E) {
56865132655e4296b780672e9a96b46a740135073534Douglas Gregor  return getDerived().TransformExpr(E->getSubExpr());
5687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
56881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
569060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
5692ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                                    CXXTemporaryObjectExpr *E) {
5693ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
5694ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
5695f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
56961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
5698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
5699c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                  getDerived().TransformDecl(E->getLocStart(),
57007c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                         E->getConstructor()));
5701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
5702f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
57031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5705ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
5706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
57071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
5708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
5709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
571091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    if (getDerived().DropCallArgument(*Arg)) {
571191be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      ArgumentChanged = true;
571291be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      break;
571391be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    }
571491be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor
571560d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult TransArg = getDerived().TransformExpr(*Arg);
5716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5717f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
57181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
5720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
5721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5724ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo() &&
5725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
572691be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor      !ArgumentChanged) {
572791be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor    // FIXME: Instantiation-specific
5728ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    SemaRef.MarkDeclarationReferenced(E->getLocStart(), Constructor);
5729a3ce8ae36144991fa125dafc5345a03cc875e503Chandler Carruth    return SemaRef.MaybeBindToTemporary(E->Retain());
573091be6f5ccbde073e592bed9a3e3bc363957714fbDouglas Gregor  }
5731ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor
5732ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(T,
5733ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor                                          /*FIXME:*/T->getTypeLoc().getEndLoc(),
5734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
5735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
5736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
573960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
5741454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                                  CXXUnresolvedConstructExpr *E) {
5742ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
5743ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (!T)
5744f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
57451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
5747ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
5748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
5749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
5750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
575160d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult TransArg = getDerived().TransformExpr(*Arg);
5752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
5753f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
57541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
57569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(TransArg.get());
5757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
57581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
5760ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor      T == E->getTypeSourceInfo() &&
5761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
57621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
57631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
5765ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(T,
5766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
5767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
5768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
5769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
57701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
577260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5773865d447ac6a4721ab58e898d014a21f2eff74b06John McCallTreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
57742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                             CXXDependentScopeMemberExpr *E) {
5775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
577660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base((Expr*) 0);
5777aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  Expr *OldBase;
5778aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5779aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType ObjectType;
5780aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->isImplicitAccess()) {
5781aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = E->getBase();
5782aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(OldBase);
5783aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5784f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
57851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5786aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    // Start the member reference and compute the object's type.
5787b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ParsedType ObjectTy;
5788d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor    bool MayBePseudoDestructor = false;
57899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(),
5790aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                E->getOperatorLoc(),
5791a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
5792d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                ObjectTy,
5793d4dca08d6b7ed2e3e3718caa6fd735960b135e9aDouglas Gregor                                                MayBePseudoDestructor);
5794aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5795f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5796aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall
5797b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    ObjectType = ObjectTy.get();
5798aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5799aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5800aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OldBase = 0;
5801aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(E->getBaseType());
5802aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
5803aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
58041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58056cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // Transform the first part of the nested-name-specifier that qualifies
58066cd219879ffce00920189ec1dcea927a42602961Douglas Gregor  // the member name.
5807c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
58086cd219879ffce00920189ec1dcea927a42602961Douglas Gregor    = getDerived().TransformFirstQualifierInScope(
58096cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getFirstQualifierFoundInScope(),
58106cd219879ffce00920189ec1dcea927a42602961Douglas Gregor                                          E->getQualifierRange().getBegin());
58111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5812a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
5813a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
5814a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
5815a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
5816aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      ObjectType,
5817aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                      FirstQualifierInScope);
5818a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
5819f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5820a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
58211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo
58232577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo(),
58242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                ObjectType);
58252577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (!NameInfo.getName())
5826f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
58271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5828aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!E->hasExplicitTemplateArgs()) {
58293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
58303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
58313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
5832aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        Base.get() == OldBase &&
5833aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall        BaseType == E->getBaseType() &&
58343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
58352577743c5650c646fb705df01403707e94f2df04Abramo Bagnara        NameInfo.getName() == E->getMember() &&
58363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
58371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
58381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58399ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
5840aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                       BaseType,
58413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
58423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
58433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
58443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
5845129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       FirstQualifierInScope,
58462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                       NameInfo,
5847129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                       /*TemplateArgs*/ 0);
58483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
5850d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
58513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
5852d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TemplateArgumentLoc Loc;
5853d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I], Loc))
5854f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5855d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    TransArgs.addArgument(Loc);
58563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
58571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58589ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
5859aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                     BaseType,
5860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
5861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
5862a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
5863a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
58643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
58652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                                     NameInfo,
5866129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                     &TransArgs);
5867129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
5868129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5869129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCalltemplate<typename Derived>
587060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5871454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
5872129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform the base of the expression.
587360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base((Expr*) 0);
5874aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  QualType BaseType;
5875aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Old->isImplicitAccess()) {
5876aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    Base = getDerived().TransformExpr(Old->getBase());
5877aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    if (Base.isInvalid())
5878f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5879aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = ((Expr*) Base.get())->getType();
5880aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  } else {
5881aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    BaseType = getDerived().TransformType(Old->getBaseType());
5882aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
5883129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5884129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  NestedNameSpecifier *Qualifier = 0;
5885129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->getQualifier()) {
5886129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier
5887129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      = getDerived().TransformNestedNameSpecifier(Old->getQualifier(),
5888edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                  Old->getQualifierRange());
5889129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (Qualifier == 0)
5890f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5891129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5892129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
58932577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  LookupResult R(SemaRef, Old->getMemberNameInfo(),
5894129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                 Sema::LookupOrdinaryName);
5895129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5896129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // Transform all the decls.
5897129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
5898129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall         E = Old->decls_end(); I != E; ++I) {
58997c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor    NamedDecl *InstD = static_cast<NamedDecl*>(
59007c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                getDerived().TransformDecl(Old->getMemberLoc(),
59017c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor                                                           *I));
59029f54ad4381370c6b771424b53d219e661d6d6706John McCall    if (!InstD) {
59039f54ad4381370c6b771424b53d219e661d6d6706John McCall      // Silently ignore these if a UsingShadowDecl instantiated to nothing.
59049f54ad4381370c6b771424b53d219e661d6d6706John McCall      // This can happen because of dependent hiding.
59059f54ad4381370c6b771424b53d219e661d6d6706John McCall      if (isa<UsingShadowDecl>(*I))
59069f54ad4381370c6b771424b53d219e661d6d6706John McCall        continue;
59079f54ad4381370c6b771424b53d219e661d6d6706John McCall      else
5908f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
59099f54ad4381370c6b771424b53d219e661d6d6706John McCall    }
5910129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5911129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    // Expand using declarations.
5912129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    if (isa<UsingDecl>(InstD)) {
5913129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      UsingDecl *UD = cast<UsingDecl>(InstD);
5914129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      for (UsingDecl::shadow_iterator I = UD->shadow_begin(),
5915129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall             E = UD->shadow_end(); I != E; ++I)
5916129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall        R.addDecl(*I);
5917129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      continue;
5918129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5919129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5920129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    R.addDecl(InstD);
5921129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5922129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5923129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  R.resolveKind();
5924129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
5925c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  // Determine the naming class.
5926042d6f98ea73d781e43cc17077e8fc84a4201eefChandler Carruth  if (Old->getNamingClass()) {
5927c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    CXXRecordDecl *NamingClass
5928c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor      = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
592966c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                          Old->getMemberLoc(),
593066c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor                                                        Old->getNamingClass()));
593166c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    if (!NamingClass)
5932f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
5933c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
593466c45154186b7786d5dca645d548d73c47cf5d87Douglas Gregor    R.setNamingClass(NamingClass);
5935c96be1ea33cdf63d07cec48d18fe8e3afea48f8dDouglas Gregor  }
5936c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
5937129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  TemplateArgumentListInfo TransArgs;
5938129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Old->hasExplicitTemplateArgs()) {
5939129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setLAngleLoc(Old->getLAngleLoc());
5940129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    TransArgs.setRAngleLoc(Old->getRAngleLoc());
5941129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    for (unsigned I = 0, N = Old->getNumTemplateArgs(); I != N; ++I) {
5942129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TemplateArgumentLoc Loc;
5943129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      if (getDerived().TransformTemplateArgument(Old->getTemplateArgs()[I],
5944129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                 Loc))
5945f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
5946129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall      TransArgs.addArgument(Loc);
5947129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    }
5948129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
5949c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall
5950c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // FIXME: to do this check properly, we will need to preserve the
5951c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // first-qualifier-in-scope here, just in case we had a dependent
5952c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // base (and therefore couldn't do the check) and a
5953c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  // nested-name-qualifier (and therefore could do the lookup).
5954c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall  NamedDecl *FirstQualifierInScope = 0;
5955c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
59569ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
5957aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall                                                  BaseType,
5958129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getOperatorLoc(),
5959129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->isArrow(),
5960129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Qualifier,
5961129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  Old->getQualifierRange(),
5962c2233c5c46eafebd5529bf2bbd1f0a723b892e61John McCall                                                  FirstQualifierInScope,
5963129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  R,
5964129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                              (Old->hasExplicitTemplateArgs()
5965129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                  ? &TransArgs : 0));
5966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
596960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5970454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
59711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
5972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
5973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
59741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
597560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5976454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
597781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  TypeSourceInfo *EncodedTypeInfo
597881d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor    = getDerived().TransformType(E->getEncodedTypeSourceInfo());
597981d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor  if (!EncodedTypeInfo)
5980f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
59811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
598381d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor      EncodedTypeInfo == E->getEncodedTypeSourceInfo())
59841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
5985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
5986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
598781d3466d037dc5844234c7a93dab21a6ad986e7dDouglas Gregor                                            EncodedTypeInfo,
5988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
5989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
59901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
599260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
5993454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
599492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Transform arguments.
599592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  bool ArgChanged = false;
5996ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> Args(SemaRef);
599792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
599860d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult Arg = getDerived().TransformExpr(E->getArg(I));
599992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (Arg.isInvalid())
6000f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6001c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
600292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
60039ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Args.push_back(Arg.get());
600492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
600592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
600692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (E->getReceiverKind() == ObjCMessageExpr::Class) {
600792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Class message: transform the receiver type.
600892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    TypeSourceInfo *ReceiverTypeInfo
600992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      = getDerived().TransformType(E->getClassReceiverTypeInfo());
601092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!ReceiverTypeInfo)
6011f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
6012c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
601392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // If nothing changed, just retain the existing message send.
601492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
601592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor        ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
601692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      return SemaRef.Owned(E->Retain());
601792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
601892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    // Build a new class message send.
601992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
602092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getSelector(),
602192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getMethodDecl(),
602292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getLeftLoc(),
602392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               move_arg(Args),
602492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                               E->getRightLoc());
602592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  }
602692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
602792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Instance message: transform the receiver
602892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
602992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor         "Only class and instance messages may be instantiated");
603060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Receiver
603192e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    = getDerived().TransformExpr(E->getInstanceReceiver());
603292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (Receiver.isInvalid())
6033f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
603492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor
603592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // If nothing changed, just retain the existing message send.
603692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
603792e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor      Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
603892e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor    return SemaRef.Owned(E->Retain());
6039c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
604092e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // Build a new instance message send.
60419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCMessageExpr(Receiver.get(),
604292e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getSelector(),
604392e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getMethodDecl(),
604492e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getLeftLoc(),
604592e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             move_arg(Args),
604692e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor                                             E->getRightLoc());
6047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
605060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6051454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
60521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
605660d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6057454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
6058ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  return SemaRef.Owned(E->Retain());
6059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
606260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6063454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
6064f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
606560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6066f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6067f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6068f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor
6069f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // We don't need to transform the ivar; it will never change.
6070c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6071f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6072f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6073f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6074f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6075c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
60769ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
6077f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->getLocation(),
6078f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                             E->isArrow(), E->isFreeIvar());
6079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
60811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
608260d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6083454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
6084e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // Transform the base expression.
608560d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6086e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (Base.isInvalid())
6087f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6088c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6089e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // We don't need to transform the property; it will never change.
6090c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6091e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  // If nothing changed, just retain the existing expression.
6092e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6093e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor      Base.get() == E->getBase())
6094e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor    return SemaRef.Owned(E->Retain());
6095c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
60969ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCPropertyRefExpr(Base.get(), E->getProperty(),
6097e330354c6bfbb0d7856432fa9055d5236f1b2fa4Douglas Gregor                                                 E->getLocation());
6098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
610160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
610209105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
6103454feb9da67504b475d032ca2a9fc34c5744748eJohn McCall                                          ObjCImplicitSetterGetterRefExpr *E) {
61049cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If this implicit setter/getter refers to class methods, it cannot have any
61059cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // dependent parts. Just retain the existing declaration.
61069cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (E->getInterfaceDecl())
61079cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6108c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61099cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // Transform the base expression.
611060d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
61119cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (Base.isInvalid())
6112f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6113c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61149cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // We don't need to transform the getters/setters; they will never change.
6115c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61169cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  // If nothing changed, just retain the existing expression.
61179cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
61189cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor      Base.get() == E->getBase())
61199cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor    return SemaRef.Owned(E->Retain());
6120c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61219cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor  return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
61229cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getGetterMethod(),
61239cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getType(),
61249cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                          E->getSetterMethod(),
61259cbfdd212ee0167f2487363d6fac7faaf7c65b64Douglas Gregor                                                             E->getLocation(),
61269ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                             Base.get());
6127c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
613160d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6132454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
6133ef57c61ec3642ba7faaf7b9c0c4a6f23fa39d77cDouglas Gregor  // Can never occur in a dependent context.
61341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
6135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
613860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6139454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
6140f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // Transform the base expression.
614160d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Base = getDerived().TransformExpr(E->getBase());
6142f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (Base.isInvalid())
6143f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6144c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6145f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  // If nothing changed, just retain the existing expression.
6146f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
6147f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor      Base.get() == E->getBase())
6148f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor    return SemaRef.Owned(E->Retain());
6149c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
61509ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
6151f9b9eab747e911ded499924b2616d8712d65efceDouglas Gregor                                         E->isArrow());
6152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
615560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6156454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
6157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
6158ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall  ASTOwningVector<Expr*> SubExprs(SemaRef);
6159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
616060d7b3a319d84d688752be3870615ac0f111fb16John McCall    ExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
6161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
6162f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      return ExprError();
61631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
61659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    SubExprs.push_back(SubExpr.get());
6166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
61671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
6169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
61701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
61711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
6173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
6174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
6175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
61771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
617860d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6179454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
6180a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  SourceLocation CaretLoc(E->getExprLoc());
6181a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6182a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  SemaRef.ActOnBlockStart(CaretLoc, /*Scope=*/0);
6183a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  BlockScopeInfo *CurBlock = SemaRef.getCurBlock();
6184a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  CurBlock->TheDecl->setIsVariadic(E->getBlockDecl()->isVariadic());
6185a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  llvm::SmallVector<ParmVarDecl*, 4> Params;
6186a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  llvm::SmallVector<QualType, 4> ParamTypes;
6187a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6188a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Parameter substitution.
6189a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  const BlockDecl *BD = E->getBlockDecl();
6190a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  for (BlockDecl::param_const_iterator P = BD->param_begin(),
6191a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian       EN = BD->param_end(); P != EN; ++P) {
6192a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParmVarDecl *OldParm = (*P);
6193a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParmVarDecl *NewParm = getDerived().TransformFunctionTypeParam(OldParm);
6194a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    QualType NewType = NewParm->getType();
6195a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    Params.push_back(NewParm);
6196a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    ParamTypes.push_back(NewParm->getType());
6197a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6198a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6199a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  const FunctionType *BExprFunctionType = E->getFunctionType();
6200a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  QualType BExprResultType = BExprFunctionType->getResultType();
6201a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!BExprResultType.isNull()) {
6202a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    if (!BExprResultType->isDependentType())
6203a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      CurBlock->ReturnType = BExprResultType;
6204a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    else if (BExprResultType != SemaRef.Context.DependentTy)
6205a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      CurBlock->ReturnType = getDerived().TransformType(BExprResultType);
6206a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6207a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6208a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Transform the body
620960d7b3a319d84d688752be3870615ac0f111fb16John McCall  StmtResult Body = getDerived().TransformStmt(E->getBody());
6210a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (Body.isInvalid())
6211f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
6212a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  // Set the parameters on the block decl.
6213a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!Params.empty())
6214a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    CurBlock->TheDecl->setParams(Params.data(), Params.size());
6215a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6216a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  QualType FunctionType = getDerived().RebuildFunctionProtoType(
6217a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        CurBlock->ReturnType,
6218a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        ParamTypes.data(),
6219a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        ParamTypes.size(),
6220a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                        BD->isVariadic(),
6221fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                        0,
6222fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                               BExprFunctionType->getExtInfo());
6223a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6224a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  CurBlock->FunctionType = FunctionType;
62259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.ActOnBlockStmtExpr(CaretLoc, Body.get(), /*Scope=*/0);
6226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
622960d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6230454feb9da67504b475d032ca2a9fc34c5744748eJohn McCallTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
6231a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  NestedNameSpecifier *Qualifier = 0;
6232a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6233a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  ValueDecl *ND
6234a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
6235a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian                                                       E->getDecl()));
6236a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!ND)
6237f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
62382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
6239a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  if (!getDerived().AlwaysRebuild() &&
6240a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian      ND == E->getDecl()) {
6241a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // Mark it referenced in the new context regardless.
6242a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    // FIXME: this is a bit instantiation-specific.
6243a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    SemaRef.MarkDeclarationReferenced(E->getLocation(), ND);
6244a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
6245a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian    return SemaRef.Owned(E->Retain());
6246a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  }
6247a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian
62482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(E->getDecl()->getDeclName(), E->getLocation());
6249a729da2c29e7df26319acf2675d51e377287a139Fariborz Jahanian  return getDerived().RebuildDeclRefExpr(Qualifier, SourceLocation(),
62502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                         ND, NameInfo, 0);
6251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
62521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
6255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
6256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
625885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
625985737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                    SourceLocation Star) {
62602865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildPointerType(PointeeType, Star,
6261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
6262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
626585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
626685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                         SourceLocation Star) {
62672865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Star,
6268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
6269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
627385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
627485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             bool WrittenAsLValue,
627585737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                             SourceLocation Sigil) {
62762865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
627785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                    Sigil, getDerived().getBaseEntity());
6278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
6279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
62801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
62811eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
628285737a71fee8c737f7cfba79a0aca89298fe573bJohn McCallTreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
628385737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 QualType ClassType,
628485737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceLocation Sigil) {
62852865474261a608c7873b87ba4af110d17907896dJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType,
628685737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        Sigil, getDerived().getBaseEntity());
6287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
62901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
6291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
6292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
6293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
6294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
6295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
6296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
6297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
6298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
6299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
6300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
63011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
63031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
63041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
63051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
6306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
6307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
6308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
6309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
6310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
6311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
6312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
6313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
63141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63159996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  IntegerLiteral ArraySize(SemaRef.Context, *Size, SizeType,
63169996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                           /*FIXME*/BracketsRange.getBegin());
63171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
6318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
63191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
6320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
6325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
6326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
632785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
632885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 SourceRange BracketsRange) {
63291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
633085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                        IndexTypeQuals, BracketsRange);
6331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
6336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
633785737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                 unsigned IndexTypeQuals,
633885737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                                   SourceRange BracketsRange) {
63391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
634085737a71fee8c737f7cfba79a0aca89298fe573bJohn McCall                                       IndexTypeQuals, BracketsRange);
6341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
6346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
63479ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                 Expr *SizeExpr,
6348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
6349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
63501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
63519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
6352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
6358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
63599ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Expr *SizeExpr,
6360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
6361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
63621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
63639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                       SizeExpr,
6364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
6365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
6369788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                     unsigned NumElements,
6370788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner                                     VectorType::AltiVecSpecific AltiVecSpec) {
6371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
6372788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  return SemaRef.Context.getVectorType(ElementType, NumElements, AltiVecSpec);
6373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
6377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
6378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
6379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
6380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
6381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
63829996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
63839996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                             AttributeLoc);
63849ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
6385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
63881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
63891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
63909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                           Expr *SizeExpr,
6391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
63929ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
6393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
63941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
63971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
6398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
63991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
6400fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                                          unsigned Quals,
6401fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                            const FunctionType::ExtInfo &Info) {
64021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
6403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
6404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
6405fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   getDerived().getBaseEntity(),
6406fa869547eb1cab12d7e0c0dfa8ba594e336b9b32Eli Friedman                                   Info);
6407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6410a2becad14a0eb19cde2f441ced588b975433d2edJohn McCallQualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
6411a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall  return SemaRef.Context.getFunctionNoProtoType(T);
6412a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall}
6413a2becad14a0eb19cde2f441ced588b975433d2edJohn McCall
6414a2becad14a0eb19cde2f441ced588b975433d2edJohn McCalltemplate<typename Derived>
6415ed97649e9574b9d854fa4d6109c9333ae0993554John McCallQualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
6416ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  assert(D && "no decl found");
6417ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (D->isInvalidDecl()) return QualType();
6418ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
641992e986e0adb79e8a47f738bd608e6c97c547641dDouglas Gregor  // FIXME: Doesn't account for ObjCInterfaceDecl!
6420ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  TypeDecl *Ty;
6421ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  if (isa<UsingDecl>(D)) {
6422ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    UsingDecl *Using = cast<UsingDecl>(D);
6423ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(Using->isTypeName() &&
6424ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-typename using");
6425ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6426ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    // A valid resolved using typename decl points to exactly one type decl.
6427ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(++Using->shadow_begin() == Using->shadow_end());
6428ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
6429c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6430ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  } else {
6431ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    assert(isa<UnresolvedUsingTypenameDecl>(D) &&
6432ed97649e9574b9d854fa4d6109c9333ae0993554John McCall           "UnresolvedUsingTypenameDecl transformed to non-using decl");
6433ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Ty = cast<UnresolvedUsingTypenameDecl>(D);
6434ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  }
6435ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6436ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  return SemaRef.Context.getTypeDeclType(Ty);
6437ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
6438ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
6439ed97649e9574b9d854fa4d6109c9333ae0993554John McCalltemplate<typename Derived>
64409ae2f076ca5ab1feb3ba95629099ec2319833701John McCallQualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E) {
64419ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildTypeofExprType(E);
6442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
6446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
6447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
64509ae2f076ca5ab1feb3ba95629099ec2319833701John McCallQualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E) {
64519ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return SemaRef.BuildDecltypeType(E);
6452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
6453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
6455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
6456833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                      TemplateName Template,
6457833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                             SourceLocation TemplateNameLoc,
6458d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo &TemplateArgs) {
6459d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
6460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
64611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6462dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6463dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6464dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6465dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6466a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
6467c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
6468d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                                   NamedDecl *FirstQualifierInScope) {
6469dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
6470dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
6471dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
6472dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
6473dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
64741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
6475495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
6476c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
6477c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
647846646491834cd8faabb22482dfe93b24ce28a6c1Chris Lattner                                                        false, false));
6479dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6480dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6481dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6482dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6483dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6484dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6485dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
6486dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
6487dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
6488dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
6489dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
6490dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
6491dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
6492dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
6493dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
6494edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor                                                   QualType T) {
6495edc90500b1d2587bf0b698fada14537d6741fddfDouglas Gregor  if (T->isDependentType() || T->isRecordType() ||
6496dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
6497a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    assert(!T.hasLocalQualifiers() && "Can't get cv-qualifiers here");
6498dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
6499dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
6500dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
65011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6502dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
6503dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
6504dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
65051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6506d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
65071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6508d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6509d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
6510d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
65111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
6512d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
6513d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
6514d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
6515d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
65161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
6517d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
65183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
65193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
6520d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
6521d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
65221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
6523014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  UnqualifiedId Name;
6524014e88d94ff83e3aad4e33b16413a2d1817ec208Douglas Gregor  Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
6525d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
6526d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6527d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6528d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
6529d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
6530b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                       ParsedType::make(ObjectType),
6531d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
6532d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
6533d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
6534d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
65351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
6537ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTemplateName
6538ca1bdd7c269a2390d43c040a60511edd017ee130Douglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
6539ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            OverloadedOperatorKind Operator,
6540ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                            QualType ObjectType) {
6541ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  CXXScopeSpec SS;
6542ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
6543ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SS.setScopeRep(Qualifier);
6544ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  UnqualifiedId Name;
6545ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
6546ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor  Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
6547ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                             Operator, SymbolLocations);
6548d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  Sema::TemplateTy Template;
6549d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  getSema().ActOnDependentTemplateName(/*Scope=*/0,
6550ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor                                       /*FIXME:*/getDerived().getBaseLocation(),
6551d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       SS,
6552d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Name,
6553b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                       ParsedType::make(ObjectType),
6554d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       /*EnteringContext=*/false,
6555d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor                                       Template);
6556d6ab232bb3ec9847de5af06249afb63078b5f2eeDouglas Gregor  return Template.template getAsVal<TemplateName>();
6557ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregor}
6558c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
6559ca1bdd7c269a2390d43c040a60511edd017ee130Douglas Gregortemplate<typename Derived>
656060d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
6561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
6562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
65639ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *OrigCallee,
65649ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *First,
65659ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                   Expr *Second) {
65669ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Callee = OrigCallee->IgnoreParenCasts();
65679ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
65681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
6570f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript) {
65719ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
65729ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType())
65739ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinArraySubscriptExpr(First,
65749ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Callee->getLocStart(),
65759ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                       Second, OpLoc);
65761a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman  } else if (Op == OO_Arrow) {
65771a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddadEli Friedman    // -> is never a builtin operation.
65789ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc);
65799ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  } else if (Second == 0 || isPostIncDec) {
65809ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType()) {
6581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
6582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
65832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      UnaryOperatorKind Opc
6584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
65851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65869ae2f076ca5ab1feb3ba95629099ec2319833701John McCall      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
6587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
65899ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    if (!First->getType()->isOverloadableType() &&
65909ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        !Second->getType()->isOverloadableType()) {
6591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
6592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
65932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
659460d7b3a319d84d688752be3870615ac0f111fb16John McCall      ExprResult Result
65959ae2f076ca5ab1feb3ba95629099ec2319833701John McCall        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
6596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
6597f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        return ExprError();
65981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
6600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
6601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
6604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
66056e26689f5d513e24ad7783a4493201930fdeccc0John McCall  UnresolvedSet<16> Functions;
66061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66079ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
6608ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    assert(ULE->requiresADL());
6609ba13543329afac4a0d01304ec2ec4924d99306a6John McCall
6610ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // FIXME: Do we have to check
6611ba13543329afac4a0d01304ec2ec4924d99306a6John McCall    // IsAcceptableNonMemberOperatorCandidate for each of these?
66126e26689f5d513e24ad7783a4493201930fdeccc0John McCall    Functions.append(ULE->decls_begin(), ULE->decls_end());
6613ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  } else {
66149ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    Functions.addDecl(cast<DeclRefExpr>(Callee)->getDecl());
6615ba13543329afac4a0d01304ec2ec4924d99306a6John McCall  }
66161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
66189ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  Expr *Args[2] = { First, Second };
66199ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  unsigned NumArgs = 1 + (Second != 0);
66201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
6622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
66232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    UnaryOperatorKind Opc
6624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
66259ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
6626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
66271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6628f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl  if (Op == OO_Subscript)
66299ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.CreateOverloadedArraySubscriptExpr(Callee->getLocStart(),
6630ba13543329afac4a0d01304ec2ec4924d99306a6John McCall                                                      OpLoc,
66319ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      First,
66329ae2f076ca5ab1feb3ba95629099ec2319833701John McCall                                                      Second);
6633f322ed6d39a30f509023cf88588c1e6514226127Sebastian Redl
6634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
66352de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
663660d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Result
6637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
6638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
6639f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    return ExprError();
66401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
6642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
66431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
664426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregortemplate<typename Derived>
664560d7b3a319d84d688752be3870615ac0f111fb16John McCallExprResult
66469ae2f076ca5ab1feb3ba95629099ec2319833701John McCallTreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
664726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceLocation OperatorLoc,
664826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       bool isArrow,
664926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                 NestedNameSpecifier *Qualifier,
665026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     SourceRange QualifierRange,
665126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                     TypeSourceInfo *ScopeType,
665226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                                       SourceLocation CCLoc,
6653fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                                       SourceLocation TildeLoc,
6654a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                        PseudoDestructorTypeStorage Destroyed) {
665526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  CXXScopeSpec SS;
665626d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  if (Qualifier) {
665726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setRange(QualifierRange);
665826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    SS.setScopeRep(Qualifier);
665926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
666026d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
66619ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  QualType BaseType = Base->getType();
66629ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
666326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor      (!isArrow && !BaseType->getAs<RecordType>()) ||
6664c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt      (isArrow && BaseType->getAs<PointerType>() &&
6665bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif       !BaseType->getAs<PointerType>()->getPointeeType()
6666bf2ca2f87ff0b33b839b1b51d233a79bb56e5bacGabor Greif                                              ->template getAs<RecordType>())){
666726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor    // This pseudo-destructor expression is still a pseudo-destructor.
66689ae2f076ca5ab1feb3ba95629099ec2319833701John McCall    return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
666926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             isArrow? tok::arrow : tok::period,
6670fce46ee68f779e239826e69e45d01d4c8e5323caDouglas Gregor                                             SS, ScopeType, CCLoc, TildeLoc,
6671a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor                                             Destroyed,
667226d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                             /*FIXME?*/true);
667326d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  }
66742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
6675a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
66762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
66772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                 SemaRef.Context.getCanonicalType(DestroyedType->getType())));
66782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
66792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  NameInfo.setNamedTypeInfo(DestroyedType);
66802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
668126d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor  // FIXME: the ScopeType should be tacked onto SS.
66822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
66839ae2f076ca5ab1feb3ba95629099ec2319833701John McCall  return getSema().BuildMemberReferenceExpr(Base, BaseType,
668426d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            OperatorLoc, isArrow,
668526d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            SS, /*FIXME: FirstQualifier*/ 0,
66862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                            NameInfo,
668726d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor                                            /*TemplateArgs*/ 0);
668826d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor}
668926d4ac97fb514bb60c2536eae6f203dc569159d9Douglas Gregor
6690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
6691577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
6692577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
6693