TreeTransform.h revision 3b6afbb99a1c44b4076f8e15fb7311405941b306
1577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===------- TreeTransform.h - Semantic Tree Transformation ---------------===/
2577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
3577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//                     The LLVM Compiler Infrastructure
4577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
5577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file is distributed under the University of Illinois Open Source
6577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// License. See LICENSE.TXT for details.
7577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
8577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
9577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  This file implements a semantic tree transformation that takes a given
10577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  AST and rebuilds it, possibly transforming some nodes in the process.
11577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
12577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
13577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H
15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "Sema.h"
17dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
18c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
19657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
20b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
25b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h"
26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h"
27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
28577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
29577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// A new tree transformation is defined by creating a new subclass \c X of
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TreeTransform<X> and then overriding certain operations to provide
37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// behavior specific to that transformation. For example, template
38577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
39577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// subclasses to customize any of its operations. Thus, a subclass can
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Subclasses can customize the transformation at various levels. The
61670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
6843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// to substitute template arguments for their corresponding template
71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// to avoid traversing nodes that don't need any transformation
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
88577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorpublic:
89b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningStmtResult OwningStmtResult;
90b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningExprResult OwningExprResult;
91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::StmtArg StmtArg;
92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::ExprArg ExprArg;
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
9443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  typedef Sema::MultiStmtArg MultiStmtArg;
95b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
96577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
97577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const Derived &getDerived() const {
104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return static_cast<const Derived&>(*this);
105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns no source-location information. Subclasses can
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                  DeclarationName Entity) : Self(Self)
150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    {
151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Determine whether the given type \p T has already been
162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// to short-circuit evaluation when it is known that a given type will
166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, this routine transforms a type by delegating to the
175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// appropriate TransformXXXType to build a new type, then applying
176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// the qualifiers on \p T to the resulting type with AddTypeQualifiers.
177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function (to take over all type
178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformations), some set of the TransformXXXType functions, or
179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// the AddTypeQualifiers function to alter the transformation.
180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType TransformType(QualType T);
183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given type by adding the given set of qualifiers
185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// and returning the result.
186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// FIXME: By default, this routine adds type qualifiers only to types that
188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// can have qualifiers, and silently suppresses those qualifiers that are
189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not permitted (e.g., qualifiers on reference or function types). This
190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// is the right thing for template instantiation, but probably not for
191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// other clients.
192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType AddTypeQualifiers(QualType T, unsigned CVRQualifiers);
193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
194657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
19643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, this routine transforms a statement by delegating to the
19743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
19843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
19943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
20043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
20143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
20243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
204657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
205657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
206657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E) {
214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Transform the given expression.
218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
230dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
231dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
232dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  Decl *TransformDecl(Decl *D) { return D; }
23343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
23443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
23543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
23643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, invokes TransformDecl() to transform the declaration.
23743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
23843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); }
239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
242dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, transforms all of the types and declarations within the
243dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
244dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
246a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
247c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
248c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
25081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
25181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
25281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
25381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
25481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
25581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
25681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName TransformDeclarationName(DeclarationName Name,
25781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                           SourceLocation Loc);
25881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
261d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
262d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// and nested-name-specifiers that occur within the template name.
263d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
269670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// By default, this operation transforms the type, expression, or
270670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// declaration stored within the template argument and constructs a
271670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
272670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg);
274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT)
276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT)                                   \
277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Transform##CLASS##Type(const CLASS##Type *T);
278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "clang/AST/TypeNodes.def"
279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
28243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
28343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Transform##Node(Node *E);
286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent)
287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildPointerType(QualType PointeeType);
294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the block pointer
298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildBlockPointerType(QualType PointeeType);
300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new lvalue reference type given the type it references.
302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the lvalue reference
304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildLValueReferenceType(QualType ReferentType);
306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new rvalue reference type given the type it references.
308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the rvalue reference
310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRValueReferenceType(QualType ReferentType);
312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType);
319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Also by default, all of the other Rebuild*Array
327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildConstantArrayType(QualType ElementType,
340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals);
343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, size expression, and index type
346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildConstantArrayWithExprType(QualType ElementType,
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            ArrayType::ArraySizeModifier SizeMod,
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            const llvm::APInt &Size,
353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            Expr *SizeExpr,
354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            unsigned IndexTypeQuals,
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            SourceRange BracketsRange);
356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildConstantArrayWithoutExprType(QualType ElementType,
363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               ArrayType::ArraySizeModifier SizeMod,
364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               const llvm::APInt &Size,
365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               unsigned IndexTypeQuals);
366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildIncompleteArrayType(QualType ElementType,
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      unsigned IndexTypeQuals);
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new variable-length array type given the element type,
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildVariableArrayType(QualType ElementType,
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new dependent-sized array type given the element type,
388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildDependentSizedArrayType(QualType ElementType,
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new potentially dependently-sized extended vector type
414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    QualType *ParamTypes,
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
4457da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4467da2431c23ef1ee8acb114e39692246e1801afc2John McCall  /// \brief Build a new elaborated type.
4477da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
4487da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return SemaRef.Context.getElaboratedType(T, Tag);
4497da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typeof(expr) type.
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typeof(type) type.
458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new C++0x decltype type.
463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             const TemplateArgument *Args,
475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             unsigned NumArgs);
476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new QualifiedNameType type from the
480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// nested-name-specifier and the named type. Subclasses may override
481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypenameType type from the nested-name-specifier
489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// and the given type. Subclasses may override this routine to provide
490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NNS->isDependent())
493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return SemaRef.Context.getTypenameType(NNS,
494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// (or qualified name type). Subclasses may override this routine to provide
503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                               const IdentifierInfo *Id) {
506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.CheckTypenameType(NNS, *Id,
507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  SourceRange(getDerived().getBaseLocation()));
508dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
509dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
511dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
512dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
513dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
516dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
517dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
518a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
519c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
520c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
521dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
522dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
523dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
524dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
525dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
526dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
527dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
528dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
529dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
530dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
531dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
532dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
533dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
534dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
535dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
536dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
537dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
538dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
539dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
540dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
541dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  QualType T);
542d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
543d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
544d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
545d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
546d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
547d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
548d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
549d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
550d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
551d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
552d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
553d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
554d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and a set of
555d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// overloaded function templates.
556d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
557d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
558d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
559d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
560d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
561d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   OverloadedFunctionDecl *Ovl);
562d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
563d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
564d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
565d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
566d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
567d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
568d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
569d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
570d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
5713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
5723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
57543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
57643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
57743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
57843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
57943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
58043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
58143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
58243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
58343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
58443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
58543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
58643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
58743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
58843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
58943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
59043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
59143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
59243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
59343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
59443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
59543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
59643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
59743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
59843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
59943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
60043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
60143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
60243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
60343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
60443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
60543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
60643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
60743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
60843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
61143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
61243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
61643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
62443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
62943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 StmtArg Then, SourceLocation ElseLoc,
63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 StmtArg Else) {
63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else));
63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
64443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) {
64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnStartOfSwitchStmt(move(Cond));
64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
65443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
66243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    Sema::FullExprArg Cond,
66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
66643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body));
66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
66943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  StmtArg Init, ExprArg Cond, ExprArg Inc,
68943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond),
69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  move(Inc), RParenLoc, move(Body));
69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
69643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
69943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
70543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
71343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
71843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
72343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation StartLoc,
73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
73543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
73843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                DeclaratorInfo *Declarator,
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
74843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
74943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
75043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
75143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch 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.
75543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
75643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
75743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
75843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
75943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
76043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
76143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
76243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
76343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
76443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
76543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
76643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
76743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
76843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
76943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
77043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
77143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
77243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) {
778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildDeclarationNameExpr(Loc, ND,
779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false,
780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*SS=*/0,
781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false);
782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
793a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
794a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  ///
795a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
796a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
797a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
798a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
799a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
800a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              SourceLocation DestroyedTypeLoc,
801a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  QualType DestroyedType,
802a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                               NestedNameSpecifier *Qualifier,
803a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceRange QualifierRange) {
804a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CXXScopeSpec SS;
805a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (Qualifier) {
806a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setRange(QualifierRange);
807a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setScopeRep(Qualifier);
808a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    }
809a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
810a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    DeclarationName Name
811a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      = SemaRef.Context.DeclarationNames.getCXXDestructorName(
812a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                               SemaRef.Context.getCanonicalType(DestroyedType));
813a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
814a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
815a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              OperatorLoc,
816a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              isArrow? tok::arrow : tok::period,
817a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              DestroyedTypeLoc,
818a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Name,
819a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Sema::DeclPtrTy::make((Decl *)0),
820a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              &SS);
821a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
822a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with an expression
843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             LBracketLoc, move(RHS),
869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
88983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     bool isArrow,
89083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
89183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
89283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     NamedDecl *Member) {
894d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
895d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
896d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
897d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson
898d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      MemberExpr *ME =
899d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson        new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
900d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
901d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
902d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
903d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
904d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson
90583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
90683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
90783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
90883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
90983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
91083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
911017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              isArrow? tok::arrow : tok::period,
913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              MemberLoc,
914017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                              Member->getDeclName(),
91583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
91683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                              &SS);
917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     (Expr *)RHS.get());
929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    LHS.release();
933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    RHS.release();
934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new implicit cast expression.
951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new implicit cast without any semantic analysis.
953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr, bool isLvalue) {
956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ImplicitCastExpr *ICE
957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (getSema().Context) ImplicitCastExpr(T, Kind,
958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 (Expr *)SubExpr.release(),
959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 isLvalue);
960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(ICE);
961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType ExplicitTy,
969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCastExpr(/*Scope=*/0,
972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   LParenLoc,
973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   ExplicitTy.getAsOpaquePtr(),
974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc,
975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(SubExpr));
976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T,
984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          RParenLoc, move(Init));
988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              tok::period, AccessorLoc,
1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Accessor,
1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RBraceLoc) {
1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis, using the name of the label
1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// operator call into a use of a builtin operator, performing
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   RAngleLoc, LParenLoc,
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    RAngleLoc, LParenLoc,
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RAngleLoc, LParenLoc,
1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move(SubExpr),
1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   RAngleLoc, LParenLoc,
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            QualType T,
1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             QualType T,
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                QualType T,
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
123988650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
124388650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               /*CommaLocs=*/0,
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// semantic analysis. Subclasses may override this routine to provide
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      QualType ThisType) {
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
1303f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(), LParenLoc,
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               MultiExprArg(getSema(), 0, 0),
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ conditional declaration expression.
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation EqLoc,
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               VarDecl *Var) {
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    EqLoc,
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    Var));
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool ParenTypeId,
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new qualified declaration reference expression.
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS,
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceRange QualifierRange,
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               NamedDecl *ND,
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation Location,
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               bool IsAddressOfOperand) {
1397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Location,
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ND->getDeclName(),
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*Trailing lparen=*/false,
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              &SS,
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              IsAddressOfOperand);
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new (previously unresolved) declaration reference
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                bool IsAddressOfOperand) {
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Location,
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Name,
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*Trailing lparen=*/false,
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              &SS,
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              IsAddressOfOperand);
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTemplateIdExpr(TemplateName Template,
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation TemplateLoc,
1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LAngleLoc,
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgument *TemplateArgs,
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         unsigned NumTemplateArgs,
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RAngleLoc) {
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildTemplateIdExpr(Template, TemplateLoc,
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         LAngleLoc,
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgs, NumTemplateArgs,
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         RAngleLoc);
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
1453ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson    return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1454ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           SourceLocation(),
1455ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           T, Constructor, IsElidable,
1456f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson                                           move(Args));
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15000dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1503a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1504a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1506c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1507c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
15080dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor    OwningExprResult Base = move(BaseE);
1509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1510a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
1511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1512a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1513a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
1514a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
15153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
1516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(Base), OperatorLoc, OpKind,
1517017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            MemberLoc,
1518017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            Name,
1519a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                    /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
1520c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            &SS,
1521c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            FirstQualifierInScope);
1522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
15243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// \brief Build a new member reference expression with explicit template
15253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// arguments.
15263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
15273b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
15283b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
15303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  bool IsArrow,
15313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation OperatorLoc,
15323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                NestedNameSpecifier *Qualifier,
15333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceRange QualifierRange,
15343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  TemplateName Template,
15353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                SourceLocation TemplateNameLoc,
15363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NamedDecl *FirstQualifierInScope,
15373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation LAngleLoc,
15383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                          const TemplateArgument *TemplateArgs,
15393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  unsigned NumTemplateArgs,
15403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation RAngleLoc) {
15413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OwningExprResult Base = move(BaseE);
15423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
15433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
15443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
15453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
15463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
15473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
15483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // FIXME: We're going to end up looking up the template based on its name,
15493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr.
15503b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    DeclarationName Name;
15513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
15523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = ActualTemplate->getDeclName();
15533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    else if (OverloadedFunctionDecl *Ovl
15543b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor               = Template.getAsOverloadedFunctionDecl())
15553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Ovl->getDeclName();
15563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    else
15573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Template.getAsDependentTemplateName()->getName();
15583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
15593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
15603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              OperatorLoc, OpKind,
15613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              TemplateNameLoc, Name, true,
15623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              LAngleLoc, TemplateArgs,
15633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NumTemplateArgs, RAngleLoc,
15643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              Sema::DeclPtrTy(), &SS);
15653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
15663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
1592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             RParenLoc));
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    const IdentifierInfo &Name
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
1611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *Callee
1612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          BuiltinLoc, false, false);
1614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
1615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build the CallExpr
1617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
1624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
1629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
1631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
163543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
163643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
163743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
163843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
163943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
164043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
164143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
164243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
164343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
164443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
164543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
164643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
164743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
164843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
164943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
165043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
165143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
165243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
165343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
165443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
165543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
165643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
165743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
165843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().Owned(E.takeAs<Stmt>());
165943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
166043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
166143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
166243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
166343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
166443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
1665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1666670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    bool isAddressOfOperand) {
1669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
1675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
1678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1681657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1682657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1683657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1684dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1685dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1686a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1687c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1688c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
16890979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
16900979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
16910979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor
169243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1693dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1694dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
1695a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1696c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1697c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
1698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1699dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
1700a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
1701c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // Clear out the object type and the first qualifier in scope; they only
1702c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
1703a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
1704c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
1705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
1709a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    assert((Prefix || !ObjectType.isNull()) &&
1710a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
1711a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1712a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
1713dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
1714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1716a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
1717c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
1718c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
1719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    NamespaceDecl *NS
1722dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
1723dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                            getDerived().TransformDecl(NNS->getAsNamespace()));
1724dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1725dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1726dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1729dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1731dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1734dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1735dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
1736dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1737dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1738dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1739dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1740d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1741d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
1742d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1743dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1744dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1745dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1746dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
1747dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1748dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1749dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1750dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   T);
1751dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1752dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1753dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1754dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
1755dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
1756dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1757dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1758dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
175981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorDeclarationName
176081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
176181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                                 SourceLocation Loc) {
176281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
176381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
176481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
176581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
176681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
176781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
176881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
176981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
177081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
177181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
177281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
177381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
177481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
177581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
177681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
177781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
177881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    QualType T = getDerived().TransformType(Name.getCXXNameType());
177981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
178081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
178181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
178281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
178381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                                           Name.getNameKind(),
178481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
178581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
178681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
178781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
178881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
178981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
179081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
179181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
1792d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName
17933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
17943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
1795d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
1796d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    NestedNameSpecifier *NNS
1797d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1798d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1799d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1800d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
1801d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1802d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
1803d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      TemplateDecl *TransTemplate
1804d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1805d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1806d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
1807d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1808d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1809d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1810d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1811d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
1812d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1813d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1814d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1815d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
1816d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1817d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1818d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    assert(Ovl && "Not a template name or an overload set?");
1819d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    OverloadedFunctionDecl *TransOvl
1820d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1821d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransOvl)
1822d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
1823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1824d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        NNS == QTN->getQualifier() &&
1826d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransOvl == Ovl)
1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
1828d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TransOvl);
1831d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
1832d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    NestedNameSpecifier *NNS
1835d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
18373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
1838d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        NNS == DTN->getQualifier())
1842d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
18443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType);
1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
1846d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    TemplateDecl *TransTemplate
1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1850d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1851d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
1852d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1853d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1854d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1855d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
1856d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1857d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1858d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
1859d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1860d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1861d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  assert(Ovl && "Not a template name or an overload set?");
1862d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  OverloadedFunctionDecl *TransOvl
1863d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1864d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!TransOvl)
1865d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName();
1866d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1867d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1868d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      TransOvl == Ovl)
1869d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return Name;
1870d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1871d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return TemplateName(TransOvl);
1872d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1873d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1874d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
1875670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTemplateArgument
1876670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) {
1877670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1878670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
1879670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1880670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return Arg;
1881670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1882670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1883670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    QualType T = getDerived().TransformType(Arg.getAsType());
1884670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (T.isNull())
1885670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1886670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(Arg.getLocation(), T);
1887670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1888670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1889670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1890670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1891670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (!D)
1892670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1893670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(Arg.getLocation(), D);
1894670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1895670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1896670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
1897670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
1898670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(getSema(),
1899670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
1900670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1901670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr());
1902670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (E.isInvalid())
1903670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1904670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(E.takeAs<Expr>());
1905670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1906670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1907670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
1908670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1909670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
1910670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
1911670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
1912670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
1913670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      TemplateArgument TA = getDerived().TransformTemplateArgument(*A);
1914670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      if (TA.isNull())
1915670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor        return TA;
1916670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1917670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      TransformedArgs.push_back(TA);
1918670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
1919670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
1920670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
1921670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
1922670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return Result;
1923670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1924670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1925670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1926670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
1927670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  return TemplateArgument();
1928670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
1929670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
1931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
1932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
1933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) {
1936577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
1937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
1938577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1939577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Result;
1940577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  switch (T->getTypeClass()) {
1941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT)
1942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT)                                                  \
1943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    case Type::CLASS:                                                        \
1944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Result = getDerived().Transform##CLASS##Type(                          \
1945577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  static_cast<CLASS##Type*>(T.getTypePtr())); \
1946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
1947577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "clang/AST/TypeNodes.def"
1948577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
1949577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1950577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Result.isNull() || T == Result)
1951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return Result;
1952577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().AddTypeQualifiers(Result, T.getCVRQualifiers());
1954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1958577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::AddTypeQualifiers(QualType T, unsigned CVRQualifiers) {
1959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (CVRQualifiers && !T->isFunctionType() && !T->isReferenceType())
1960577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.getWithAdditionalQualifiers(CVRQualifiers);
1961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return T;
1963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19641bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
1965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformExtQualType(const ExtQualType *T) {
1967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
1968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) {
1973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // Nothing to do
1974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1978577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFixedWidthIntType(
1979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const FixedWidthIntType *T) {
1980577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
1981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1982577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) {
1986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
1987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1990577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1991577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) {
1992577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1993577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1996577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1997577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
1998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2000577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildPointerType(PointeeType);
2001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2002577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
2005577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) {
2006577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2007577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2008577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
2012577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildBlockPointerType(PointeeType);
2015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2016577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2018577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
2019577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformLValueReferenceType(
2020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               const LValueReferenceType *T) {
2021577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2026577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
2027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildLValueReferenceType(PointeeType);
2030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformRValueReferenceType(
2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              const RValueReferenceType *T) {
2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2039577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2040577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2041577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
2042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildRValueReferenceType(PointeeType);
2045577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
2049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) {
2050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2052577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0));
2055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2058577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType() &&
2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ClassType == QualType(T->getClass(), 0))
2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2062577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildMemberPointerType(PointeeType, ClassType);
2064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) {
2069577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2071577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildConstantArrayType(ElementType,
2078577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSizeModifier(),
2079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSize(),
2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getIndexTypeQualifier());
2081577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
2085577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayWithExprType(
2086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      const ConstantArrayWithExprType *T) {
2087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2088577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2090577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2091670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2092670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2093670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2094670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2095670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  if (Size.isInvalid())
2096670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return QualType();
2097670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2099670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      ElementType == T->getElementType() &&
2100670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      Size.get() == T->getSizeExpr())
2101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildConstantArrayWithExprType(ElementType,
2104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getSizeModifier(),
2105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getSize(),
2106670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                       Size.takeAs<Expr>(),
2107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   T->getIndexTypeQualifier(),
2108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getBracketsRange());
2109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
2113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayWithoutExprType(
2114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      const ConstantArrayWithoutExprType *T) {
2115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildConstantArrayWithoutExprType(ElementType,
2124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getSizeModifier(),
2125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getSize(),
2126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                    T->getIndexTypeQualifier());
2127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
2131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              const IncompleteArrayType *T) {
2132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2134577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2135577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2136577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2137577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2138577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2139577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildIncompleteArrayType(ElementType,
2141577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 T->getSizeModifier(),
2142577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 T->getIndexTypeQualifier());
2143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVariableArrayType(
2147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const VariableArrayType *T) {
2148577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2149577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2152670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2153670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2154670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2155577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2156577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2157577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2158577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
2161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
2162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
2163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildVariableArrayType(ElementType,
2167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSizeModifier(),
2168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               move(Size),
2169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getIndexTypeQualifier(),
2170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getBracketsRange());
2171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedArrayType(
2175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          const DependentSizedArrayType *T) {
2176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2180670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2181670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2182670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
2189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
2190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
2191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildDependentSizedArrayType(ElementType,
2195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     T->getSizeModifier(),
2196577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     move(Size),
2197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     T->getIndexTypeQualifier(),
2198577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     T->getBracketsRange());
2199577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2200577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
2203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      const DependentSizedExtVectorType *T) {
2204577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2205577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2206577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2207577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2208670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2209670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2210670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2212577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2214577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2216577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
2217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
2218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
2219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildDependentSizedExtVectorType(ElementType,
2223577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) {
2229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2230577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2236577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildVectorType(ElementType, T->getNumElements());
2238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
2242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) {
2243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2246577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2250577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(),
2252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           /*FIXME*/SourceLocation());
2253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2255577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionProtoType(
2257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const FunctionProtoType *T) {
2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ResultType = getDerived().TransformType(T->getResultType());
2259577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ResultType.isNull())
2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2262577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<QualType, 4> ParamTypes;
2263577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
2264577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ParamEnd = T->arg_type_end();
2265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor       Param != ParamEnd; ++Param) {
2266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    QualType P = getDerived().TransformType(*Param);
2267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (P.isNull())
2268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    ParamTypes.push_back(P);
2271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ResultType == T->getResultType() &&
2275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin()))
2276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(),
2279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               ParamTypes.size(), T->isVariadic(),
2280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getTypeQuals());
2281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
2285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                const FunctionNoProtoType *T) {
2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
2287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
2288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) {
2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
2293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Typedef == T->getDecl())
2299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypedefType(Typedef);
2302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfExprType(
2306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                    const TypeOfExprType *T) {
2307670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
2308670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2309670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      E.get() == T->getUnderlyingExpr()) {
2316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    E.take();
2317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypeOfExprType(move(E));
2321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) {
2325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Underlying.isNull())
2327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Underlying == T->getUnderlyingType())
2331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypeOfType(Underlying);
2334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) {
2338670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
2339670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2340670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      E.get() == T->getUnderlyingExpr()) {
2347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    E.take();
2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildDecltypeType(move(E));
2352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) {
2356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
2357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
2359577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Record == T->getDecl())
2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildRecordType(Record);
2366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) {
2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
2371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
2373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Enum == T->getDecl())
2377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildEnumType(Enum);
2380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23817da2431c23ef1ee8acb114e39692246e1801afc2John McCall
23827da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
23837da2431c23ef1ee8acb114e39692246e1801afc2John McCallQualType TreeTransform<Derived>::TransformElaboratedType(
23847da2431c23ef1ee8acb114e39692246e1801afc2John McCall                                                    const ElaboratedType *T) {
23857da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
23867da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
23877da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
23887da2431c23ef1ee8acb114e39692246e1801afc2John McCall
23897da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (!getDerived().AlwaysRebuild() &&
23907da2431c23ef1ee8acb114e39692246e1801afc2John McCall      Underlying == T->getUnderlyingType())
23917da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType(T, 0);
23927da2431c23ef1ee8acb114e39692246e1801afc2John McCall
23937da2431c23ef1ee8acb114e39692246e1801afc2John McCall  return getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
23947da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
23957da2431c23ef1ee8acb114e39692246e1801afc2John McCall
2396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
2399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              const TemplateTypeParmType *T) {
2400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // Nothing to do
2401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
2402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        const TemplateSpecializationType *T) {
2407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TemplateName Template
2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName());
2409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
2410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs;
2413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NewTemplateArgs.reserve(T->getNumArgs());
2414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor       Arg != ArgEnd; ++Arg) {
2416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg);
2417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewArg.isNull())
2418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    NewTemplateArgs.push_back(NewArg);
2421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: early abort if all of the template arguments and such are the
2424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // same.
2425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2426577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: We're missing the locations of the template name, '<', and '>'.
2427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTemplateSpecializationType(Template,
2428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        NewTemplateArgs.data(),
2429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        NewTemplateArgs.size());
2430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformQualifiedNameType(
2434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const QualifiedNameType *T) {
2435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                SourceRange());
2438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      NNS == T->getQualifier() &&
2447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Named == T->getNamedType())
2448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildQualifiedNameType(NNS, Named);
2451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) {
2455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
24574a959d8788179d654df6b213b08d2b064989211dDouglas Gregor                        SourceRange(/*FIXME:*/getDerived().getBaseLocation()));
2458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
2462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    QualType NewTemplateId
2463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
2464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
2465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
2469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
2470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
2471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return getDerived().RebuildTypenameType(NNS, NewTemplateId);
2473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypenameType(NNS, T->getIdentifier());
2476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCInterfaceType(
2480577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const ObjCInterfaceType *T) {
2481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
2482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
2483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2484577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCObjectPointerType(
2487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             const ObjCObjectPointerType *T) {
2488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
2489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
2490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
249343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
249443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
249543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
249643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
249743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
249843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
249943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
250043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
250143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
250243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
250343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
250443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
250543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
250643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
250743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
250843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
250943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
251043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
251143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
251243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
251343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
251443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
251543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
251643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
251743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
251843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
251943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
252043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
252143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
252243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
252343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
252443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
252543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
252643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
252743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
252843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
252943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
253043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
253143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
253243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
253343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
253443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
253543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
253643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // The case value expressions are not potentially evaluated.
253743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
253843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
253943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the left-hand case value.
254043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
254143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (LHS.isInvalid())
254243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
254343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
254443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the right-hand case value (for the GNU case-range extension).
254543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
254643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (RHS.isInvalid())
254743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
254843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
254943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
255043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
255143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
255243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
255343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
255443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
255543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
255643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
255743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
255843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
255943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
256043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
256143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
256243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
256343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
256443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
256543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
256643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
256743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
256843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
256943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
257043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
257143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
257243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
257343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
257443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
257543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
257643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
257743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
257843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
257943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
258043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
258143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
258243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
258343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
258443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
258543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
258643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
258743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
258843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
258943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
259043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
259143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
259243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
259343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
259443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
259543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
259643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
259743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
259843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
259943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
260043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
260143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
260243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
260343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
260443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
260543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
260643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
260743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
260843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
260943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
261043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
261143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
261243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
261343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
261443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
261543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
261643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
261743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
261843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
261943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
262043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
262143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
262243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getElseLoc(), move(Else));
262343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
262443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
262543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
262643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
262743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
262843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
262943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
263043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
263143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
263243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
263343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
263443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
263543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
263643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
263743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
263843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
263943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
264043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
264143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
264243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
264343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
264443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
264543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
264643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
264743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
264843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
264943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
265043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
265143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
265243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
265343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
265443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
265543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
265643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
265743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
265843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
265943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
266043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
266143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
266243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
266343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
266443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
266543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
266643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
266743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
266843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
266943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
267043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
267143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
267243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
267343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
267443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
267543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
267643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
267743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
267843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
267943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
268043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
268143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
268243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
268343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
268443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
268543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
268643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
268743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
268843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
268943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
269043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
269143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
269243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
269343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
269443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
269543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
269643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
269743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
269843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
269943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
270043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
270143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
270243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
270343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
270443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
270543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
270643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
270743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
270843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
270943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
271043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
271143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
271243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
271343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
271443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
271543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
271643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
271743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
271843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
271943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
272043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
272143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
272243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
272343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
272443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
272543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     move(Init), move(Cond), move(Inc),
272643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
272743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
272843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
272943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
273043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
273143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
273243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
273343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
273443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
273543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
273643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
273743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
273843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
273943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
274043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
274143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
274243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
274343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
274443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
274543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
274643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
274743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
274843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
274943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
275043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
275143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
275243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
275343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
275443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
275543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
275643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
275743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
275843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
275943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
276043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
276143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
276243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
276343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
276443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
276543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
276643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
276743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
276843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
276943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
277043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
277143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: We always rebuild the return statement because there is no way
277243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
277343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
277443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
277543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
277643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
277743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
277843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
277943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
278043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
278143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
278243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
278343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition(*D);
278443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
278543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
278643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
278743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
278843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
278943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
279043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
279143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
279243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
279343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
279443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
279543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
279643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
279743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
279843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
279943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
280043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
280143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
280243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
280343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
280443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
280543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
280643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
280743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
280843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
280943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
281043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement!
281143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Inline assembly cannot be transformed");
281243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
281343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
281443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
281543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
281643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
281743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
281843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
281943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
282043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @try statement");
282143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
282243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
282343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
282443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
282543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
282643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
282743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
282843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @catch statement");
282943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
283043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
283143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
283243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
283343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
283443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
283543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
283643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @finally statement");
283743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
283843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
283943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
284043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
284143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
284243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
284343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
284443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @throw statement");
284543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
284643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
284743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
284843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
284943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
285043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
285143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  ObjCAtSynchronizedStmt *S) {
285243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
285343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @synchronized statement");
285443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
285543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
285643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
285743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
285843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
285943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
286043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  ObjCForCollectionStmt *S) {
286143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
286243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C for-each statement");
286343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
286443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
286543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
286643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
286743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
286843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
286943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
287043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
287143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
287243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
287343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
287443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
287543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
287643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
287743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
287843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
287943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
288043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
288143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
288243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
288343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getDeclaratorInfo(),
288443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
288543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
288643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
288743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
288843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
288943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
289043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
289143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
289243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
289343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
289443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
289543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
289643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
289743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
289843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
289943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
290043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
290143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
290243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
290343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
290443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
290543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
290643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
290743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
290843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
290943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
291043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
291143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
291243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
291343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
291443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
291543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
291643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
291743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TryBlock
291843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
291943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
292043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
292143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
292243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
292343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
292443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
292543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
292643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Handler
292743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
292843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
292943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
293043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
293143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
293243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
293343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
293443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
293543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
293643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
293743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
293843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S->Retain());
293943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
294043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
294143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        move_arg(Handlers));
294243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
294343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
294443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
2945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
2946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2947577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
2950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
2956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NamedDecl *ND
2957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
2958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
2959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && ND == E->getDecl())
2962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDeclRefExpr(ND, E->getLocation());
2965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
2970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
2976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
2982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
2988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
2994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
3000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
3005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
3008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
3009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
3014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
3019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
3023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
3024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
3029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
3030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getArgumentType());
3031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
3035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
3038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->isSizeOf(),
3039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
3040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
3043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
3045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
3046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
3047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
3048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
3051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
3059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
3060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
3081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
3082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
3083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
3089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
3094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
3095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
3103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
3105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
3108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
3113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
3116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
3117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
3120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
3121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
3127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
313183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
313283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
313383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    Qualifier
313483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
313583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                                  E->getQualifierRange());
3136c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
313783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
313883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
313983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
3140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NamedDecl *Member
3141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
3143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
314783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
3148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Member == E->getMemberDecl())
3149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
3152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
315783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
315883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
3159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
3160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        Member);
3161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
3167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
3173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
3188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
3193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CompoundAssignOperator *E) {
3194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformBinaryOperator(E);
3195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildConditionalOperator(move(Cond),
321947e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
3220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(LHS),
322147e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
3222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
3223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
3228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
3242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
3243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->isLvalueCast());
3244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
3250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
3256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation TypeStartLoc
3260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
3262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getTypeAsWritten());
3264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
3274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
3279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
3280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation FakeTypeLoc
3289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
3291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
3304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
3308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
3309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
3314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
3320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
3323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
3327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
3328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
3333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
3334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
3342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
3346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRBraceLoc());
3350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
3355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
3356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
335743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
3358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
336243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
3363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
3365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
3367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
3368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
3369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
3370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
3371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
3372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
3374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
3376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
3378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
3379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getArray(Index.get(),
3381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
3382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
3385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
3387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
3389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Start
3390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
3392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
3396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
3400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
3401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
3402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
3405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
3407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
3408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
3412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
3413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
3417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
3418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
3423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    ImplicitValueInitExpr *E) {
3424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
3430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
3433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
3439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
3478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
3482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
3491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
3495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult SubStmt
3496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
3498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
3502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
3505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
3506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
3513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
3519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
3522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
3529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
3532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
3538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
3557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
3559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
3564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
3570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
3579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
3581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
3582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
3588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
3589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Callee),
3594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
3601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCallExpr(E);
3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
3607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation TypeStartLoc
3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLAngleLoc
3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
3632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getStmtClass(),
3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExplicitTy,
3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
3641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
3643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                CXXReinterpretCastExpr *E) {
3661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
3667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   CXXFunctionalCastExpr *E) {
3674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
3675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
3680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
3689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
3693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
3694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExplicitTy,
3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
3697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
3699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
3712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
3713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
3717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
3719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
3724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef,
3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
3728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
3738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
3739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CXXNullPtrLiteralExpr *E) {
3751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ParmVarDecl *Param
3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (getDerived().AlwaysRebuild() &&
3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(Param);
3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  VarDecl *Var
382243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Var)
3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Var == E->getVarDecl())
3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  /*FIXME:*/E->getStartLoc(),
3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  Var);
3833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
3850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
3853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
3854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
3858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
3859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
386143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
3862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
3863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
3864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
3865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
3869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
3870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
3874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
3875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
3876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
3879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
3880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
3882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
3884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
3885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
3887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
3888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getLocEnd());
3891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
3898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Operand.get() == E->getArgument())
3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
3908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3912a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
3913a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                CXXPseudoDestructorExpr *E) {
3914a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3915a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
3916a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
3917a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
3918a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
3919a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3920a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                E->getQualifierRange());
3921a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
3922a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
3923a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
3924a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  QualType DestroyedType;
3925a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  {
3926a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
3927a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    DestroyedType = getDerived().TransformType(E->getDestroyedType());
3928a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (DestroyedType.isNull())
3929a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
3930a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
3931a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
3932a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3933a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Base.get() == E->getBase() &&
3934a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Qualifier == E->getQualifier() &&
3935a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      DestroyedType == E->getDestroyedType())
3936a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.Owned(E->Retain());
3937a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
3938a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
3939a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
3940a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
3941a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getDestroyedTypeLoc(),
3942a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     DestroyedType,
3943a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
3944a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getQualifierRange());
3945a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
3946a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
3947a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
3948a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
3949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              UnresolvedFunctionNameExpr *E) {
3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // There is no transformation we can apply to an unresolved function name.
3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
3958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
3961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
3966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
3969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
3975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
3976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
3983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getQualifierRange());
3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NamedDecl *ND
3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      NNS == E->getQualifier() &&
3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ND == E->getDecl())
3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildQualifiedDeclRefExpr(NNS,
3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getQualifierRange(),
4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  ND,
4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getLocation(),
4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  /*FIXME:*/false);
4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    UnresolvedDeclRefExpr *E) {
4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getQualifierRange());
4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
401581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName Name
401681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
401781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
401881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      NNS == E->getQualifier() &&
4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Name == E->getDeclName())
4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getQualifierRange(),
4027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   Name,
4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getLocation(),
4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   /*FIXME:*/false);
4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemplateName Template
4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformTemplateName(E->getTemplateName());
4037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Template.isNull())
4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<TemplateArgument, 4> TransArgs;
4041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemplateArgument TransArg
4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
4044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isNull())
4045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TransArgs.push_back(TransArg);
4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // compare template arguments (yet).
4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: It's possible that we'll find out now that the template name
4054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // actually refers to a type, in which case the caller is actually dealing
4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // with a functional cast. Give a reasonable error message!
4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
4057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLAngleLoc(),
4058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.data(),
4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.size(),
4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRAngleLoc());
4061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                              getDerived().TransformDecl(E->getConstructor()));
4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
4081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
4096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
4102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// The transformation of a temporary-binding expression always attempts to
4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// bind a new temporary variable to its subexpression, even if the
4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself
4106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique.
4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ expression that contains temporaries that should
4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// The transformation of a full expression always attempts to build a new
4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// CXXExprWithTemporaries expression, even if the
4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the
4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression.
4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
4127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                CXXExprWithTemporaries *E) {
4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(
4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor           SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->shouldDestroyTemporaries()));
4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CXXTemporaryObjectExpr *E) {
4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                            getDerived().TransformDecl(E->getConstructor()));
4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
4156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
4157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
4175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
4176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CommaLoc
4177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
4181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
4183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
4184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
4185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
4190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            CXXUnresolvedConstructExpr *E) {
4191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
4193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
4201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
4214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
4216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
4218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
4220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
4221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
4222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
4223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
4224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4225bd4c4aebe6035e7a7125470cc9f0f92511230ee3Douglas Gregor
4226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
4229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CXXUnresolvedMemberExpr *E) {
4230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
4231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4235a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  Sema::TypeTy *ObjectType = 0;
4236a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4237a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              E->getOperatorLoc(),
4238a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
4239a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              ObjectType);
4240a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (Base.isInvalid())
4241a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    return SemaRef.ExprError();
4242a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
42433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: The first qualifier found might be a template type parameter,
42443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // in which case there is no transformed declaration to refer to (it might
42453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // refer to a built-in type!).
4246c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
4247c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    = cast_or_null<NamedDecl>(
4248c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor              getDerived().TransformDecl(E->getFirstQualifierFoundInScope()));
4249c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor
4250a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4251a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
4252a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4253a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
4254c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                      QualType::getFromOpaquePtr(ObjectType),
4255c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope);
4256a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
4257a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
4258a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
4259a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
426081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName Name
426181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc());
426281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
426381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
426481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
42653b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (!E->hasExplicitTemplateArgumentList()) {
42663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
42673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
42683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
42693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Base.get() == E->getBase() &&
42703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
42713b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
42723b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
42733b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.Owned(E->Retain());
42743b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
42753b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
42763b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
42773b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
42783b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
42793b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
42803b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
42813b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
42823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       FirstQualifierInScope);
42833b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
42843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
42853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This is an ugly hack, which forces the same template name to
42863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // be looked up multiple times. Yuck!
42873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This also won't work for, e.g., x->template operator+<int>
42883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName OrigTemplateName
42893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo());
42903b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
42913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName Template
42923b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    = getDerived().TransformTemplateName(OrigTemplateName,
42933b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                       QualType::getFromOpaquePtr(ObjectType));
42943b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (Template.isNull())
42953b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.ExprError();
42963b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
42973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  llvm::SmallVector<TemplateArgument, 4> TransArgs;
42983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
42993b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    TemplateArgument TransArg
43003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
43013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (TransArg.isNull())
43023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
43033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
43043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    TransArgs.push_back(TransArg);
43053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
4306a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
4310a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
4311a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
43123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     Template,
4313c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     E->getMemberLoc(),
43143b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
43153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     E->getLAngleLoc(),
43163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     TransArgs.data(),
43173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     TransArgs.size(),
43183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     E->getRAngleLoc());
4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
4330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
4334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
4338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
4339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
4343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
4348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
4356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
4362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ObjCProtocolDecl *Protocol
4363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
4364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                getDerived().TransformDecl(E->getProtocol()));
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
4371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
4375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
4385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
4393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
439809105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
439909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                                          ObjCImplicitSetterGetterRefExpr *E) {
4400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
4430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
4433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
4438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
4441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
4442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
4447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
4449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
4455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
4457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
4458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
4461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
4462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
4463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
4466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.BuildPointerType(PointeeType, 0,
4467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseLocation(),
4468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
4469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
4473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.BuildBlockPointerType(PointeeType, 0,
4474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseLocation(),
4475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
4476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType
4480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
4481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.BuildReferenceType(ReferentType, true, 0,
4482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    getDerived().getBaseLocation(),
4483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    getDerived().getBaseEntity());
4484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType
4488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
4489577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildReferenceType(ReferentType, false, 0,
4490577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    getDerived().getBaseLocation(),
4491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    getDerived().getBaseEntity());
4492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4493577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
4496577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          QualType ClassType) {
4497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 0,
4498577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        getDerived().getBaseLocation(),
4499577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        getDerived().getBaseEntity());
4500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4501577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
4504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
4506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
4507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
4508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
4509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
4510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
4511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
4512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
4513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
4514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Types[] = {
4516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
4517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
4518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
4519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
4520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
4521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
4522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
4523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
4524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
4525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
4526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
4527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeType.isNull())
4529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
4530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
4532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
4533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
4534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                getDerived().getBaseEntity());
4535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
4539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
4540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
4541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
4542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals) {
4543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
4544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        IndexTypeQuals, SourceRange());
4545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
4549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayWithExprType(QualType ElementType,
4550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4551577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      const llvm::APInt &Size,
4552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         Expr *SizeExpr,
4553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned IndexTypeQuals,
4554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                    SourceRange BracketsRange) {
4555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
4556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
4557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
4561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayWithoutExprType(
4562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        QualType ElementType,
4563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       const llvm::APInt &Size,
4565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     unsigned IndexTypeQuals) {
4566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
4567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, SourceRange());
4568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
4572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
4573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals) {
4575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
4576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, SourceRange());
4577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
4581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
4582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
4584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
4585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
4586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
4588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
4589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
4593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
4594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
4596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
4597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
4598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
4600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
4601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
4605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   unsigned NumElements) {
4606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
4607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getVectorType(ElementType, NumElements);
4608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
4612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
4613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
4614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
4615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
4616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
4617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
4618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
4619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
4620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
4621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
4625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
4626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
4627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
4628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
4629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
4633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          QualType *ParamTypes,
4634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
4635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          bool Variadic,
4636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
4637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
4638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
4639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
4640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
4641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
4645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
4646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
4650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
4651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
4655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
4656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
4660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        TemplateName Template,
4661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const TemplateArgument *Args,
4662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                           unsigned NumArgs) {
4663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Missing source locations for the template name, <, >.
4664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(),
4665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                     SourceLocation(), Args, NumArgs,
4666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                     SourceLocation());
4667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4669dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
4670dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
4671dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4672dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
4673a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
4674c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
4675c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
4676dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
4677dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
4678dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
4679dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
4680dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
4681c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
4682495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
4683c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
4684c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
4685495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        false));
4686dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
4687dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
4688dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
4689dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
4690dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4691dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
4692dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
4693dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
4694dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
4695dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
4696dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
4697dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
4698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4699dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
4700dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
4701dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   QualType T) {
4702dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (T->isDependentType() || T->isRecordType() ||
4703dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
4704dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here");
4705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
4706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
4707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
4708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
4709dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
4710dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
4711dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
4712dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
4713d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
4714d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName
4715d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4716d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
4717d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
4718d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
4719d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
4720d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
4721d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
4722d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
4723d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName
4724d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4725d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
4726d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            OverloadedFunctionDecl *Ovl) {
4727d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
4728d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
4729d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
4730d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
4731d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName
4732d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
47333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
47343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
4735d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
4736d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
47373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  SS.setScopeRep(Qualifier);
47383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
47393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
47403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              II,
47413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
47423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
47433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              ObjectType.getAsOpaquePtr())
47443b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
4745d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
4746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
4750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
4751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
4752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
4753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
4754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
4755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
4756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
4757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
4759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SecondExpr == 0 || isPostIncDec) {
4760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
4761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
4762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
4763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      UnaryOperator::Opcode Opc
4764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
4765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
4767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
4768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
4769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType() &&
4770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
4771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
4772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
4773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
4774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Result
4775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
4776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
4777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
4778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
4780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
4781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
4782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
4783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Compute the transformed set of functions (and function templates) to be
4786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
4787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::FunctionSet Functions;
4788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
47898f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor  DeclRefExpr *DRE
47908f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor    = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
4791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we have to check
4793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // IsAcceptableNonMemberOperatorCandidate for each of these?
47948f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor  for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
4795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Functions.insert(*F);
4796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
4798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
4799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
4800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  DeclarationName OpName
4801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
4802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions);
4803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
4805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
4806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    UnaryOperator::Opcode Opc
4807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
4808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
4809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
4812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  BinaryOperator::Opcode Opc =
4813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
4814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Result
4815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
4816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
4817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
4820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
4821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return move(Result);
4822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
4824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
4825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
4827