TreeTransform.h revision 1bb8a45f7386a23871598d05141a07af03067925
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"
18657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
19b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
20b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h"
22b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h"
23b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
24577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
25577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
26577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
27577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
28577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
29577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// A new tree transformation is defined by creating a new subclass \c X of
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TreeTransform<X> and then overriding certain operations to provide
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// behavior specific to that transformation. For example, template
34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
38577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
39577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// subclasses to customize any of its operations. Thus, a subclass can
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Subclasses can customize the transformation at various levels. The
57670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// PointerType) to alter the transformation. As mentioned previously,
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// to substitute template arguments for their corresponding template
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// to avoid traversing nodes that don't need any transformation
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// FIXME: In the future, TreeTransform will support transformation of
81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// statements and expressions as well as types.
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorpublic:
88b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningStmtResult OwningStmtResult;
89b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningExprResult OwningExprResult;
90b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::StmtArg StmtArg;
91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::ExprArg ExprArg;
92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
94577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
95577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
96577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
97577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const Derived &getDerived() const {
102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return static_cast<const Derived&>(*this);
103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns no source-location information. Subclasses can
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                  DeclarationName Entity) : Self(Self)
148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    {
149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Determine whether the given type \p T has already been
160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// to short-circuit evaluation when it is known that a given type will
164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, this routine transforms a type by delegating to the
173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// appropriate TransformXXXType to build a new type, then applying
174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// the qualifiers on \p T to the resulting type with AddTypeQualifiers.
175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function (to take over all type
176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformations), some set of the TransformXXXType functions, or
177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// the AddTypeQualifiers function to alter the transformation.
178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType TransformType(QualType T);
181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given type by adding the given set of qualifiers
183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// and returning the result.
184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// FIXME: By default, this routine adds type qualifiers only to types that
186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// can have qualifiers, and silently suppresses those qualifiers that are
187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not permitted (e.g., qualifiers on reference or function types). This
188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// is the right thing for template instantiation, but probably not for
189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// other clients.
190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType AddTypeQualifiers(QualType T, unsigned CVRQualifiers);
191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
192657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// FIXME: At the moment, subclasses must override this.
195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
196657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
197657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
198657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E) {
206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Transform the given expression.
210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
222dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
223dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
224dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  Decl *TransformDecl(Decl *D) { return D; }
225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
228dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, transforms all of the types and declarations within the
229dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
230dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                    SourceRange Range);
233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
236d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
237d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// and nested-name-specifiers that occur within the template name.
238d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
239d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName TransformTemplateName(TemplateName Name);
240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
243670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// By default, this operation transforms the type, expression, or
244670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// declaration stored within the template argument and constructs a
245670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
246670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg);
248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT)
250577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT)                                   \
251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Transform##CLASS##Type(const CLASS##Type *T);
252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "clang/AST/TypeNodes.def"
253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformCompoundStmt(Stmt *S, bool IsStmtExpr) {
255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Actually handle this transformation properly.
256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().TransformStmt(S);
257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent)
260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Transform##Node(Node *E);
262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent)
263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildPointerType(QualType PointeeType);
270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the block pointer
274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildBlockPointerType(QualType PointeeType);
276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new lvalue reference type given the type it references.
278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the lvalue reference
280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildLValueReferenceType(QualType ReferentType);
282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new rvalue reference type given the type it references.
284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the rvalue reference
286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRValueReferenceType(QualType ReferentType);
288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType);
295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Also by default, all of the other Rebuild*Array
303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(QualType ElementType,
304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            ArrayType::ArraySizeModifier SizeMod,
305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            const llvm::APInt *Size,
306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            Expr *SizeExpr,
307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            unsigned IndexTypeQuals,
308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                            SourceRange BracketsRange);
309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildConstantArrayType(QualType ElementType,
316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    const llvm::APInt &Size,
318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals);
319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, 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  QualType RebuildConstantArrayWithExprType(QualType ElementType,
327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            ArrayType::ArraySizeModifier SizeMod,
328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            const llvm::APInt &Size,
329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            Expr *SizeExpr,
330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            unsigned IndexTypeQuals,
331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                            SourceRange BracketsRange);
332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new constant array type given the element type, size
334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, (known) size of the array, and index type qualifiers.
335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildConstantArrayWithoutExprType(QualType ElementType,
339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               ArrayType::ArraySizeModifier SizeMod,
340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               const llvm::APInt &Size,
341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               unsigned IndexTypeQuals);
342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new incomplete array type given the element type, size
344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, and index type qualifiers.
345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildIncompleteArrayType(QualType ElementType,
349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      unsigned IndexTypeQuals);
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new variable-length array type given the element type,
353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildVariableArrayType(QualType ElementType,
358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new dependent-sized array type given the element type,
364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// size modifier, size expression, and index type qualifiers.
365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildDependentSizedArrayType(QualType ElementType,
369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          ExprArg SizeExpr,
371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          unsigned IndexTypeQuals,
372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          SourceRange BracketsRange);
373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new vector type given the element type and
375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new extended vector type given the element type and
382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// number of elements.
383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                SourceLocation AttributeLoc);
388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new potentially dependently-sized extended vector type
390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// given the element type and number of elements.
391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the vector type.
393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new function type.
399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the function type.
401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildFunctionProtoType(QualType T,
403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    QualType *ParamTypes,
404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typedef type.
408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypedefType(TypedefDecl *Typedef) {
409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Typedef);
410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new class/struct/union type.
413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRecordType(RecordDecl *Record) {
414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Record);
415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new Enum type.
418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildEnumType(EnumDecl *Enum) {
419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getTypeDeclType(Enum);
420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typeof(expr) type.
423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typeof(type) type.
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new C++0x decltype type.
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             const TemplateArgument *Args,
446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             unsigned NumArgs);
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new QualifiedNameType type from the
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// nested-name-specifier and the named type. Subclasses may override
452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypenameType type from the nested-name-specifier
460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// and the given type. Subclasses may override this routine to provide
461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NNS->isDependent())
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return SemaRef.Context.getTypenameType(NNS,
465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// (or qualified name type). Subclasses may override this routine to provide
474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                               const IdentifierInfo *Id) {
477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.CheckTypenameType(NNS, *Id,
478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  SourceRange(getDerived().getBaseLocation()));
479dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
480dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
481dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
482dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
483dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
484dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
485dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
486dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
487dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
488dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
489dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  IdentifierInfo &II);
490dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
491dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
492dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
493dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
494dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
495dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
496dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
497dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
498dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
499dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
500dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
501dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
502dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
503dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
504dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
505dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
506dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
507dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
508dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
509dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  QualType T);
511d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
512d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
513d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
514d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
515d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
516d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
517d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
518d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
519d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
520d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
521d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
522d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
523d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and a set of
524d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// overloaded function templates.
525d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
526d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
527d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
528d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
529d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
530d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   OverloadedFunctionDecl *Ovl);
531d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
532d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
533d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
534d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
535d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
536d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
537d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
538d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
539d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
540d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   const IdentifierInfo &II);
541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) {
548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildDeclarationNameExpr(Loc, ND,
549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false,
550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*SS=*/0,
551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false);
552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with an expression
583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             LBracketLoc, move(RHS),
609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool isArrow, SourceLocation MemberLoc,
630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     NamedDecl *Member) {
631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              isArrow? tok::arrow : tok::period,
633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              MemberLoc,
634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME*/*Member->getIdentifier(),
635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     (Expr *)RHS.get());
648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    LHS.release();
652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    RHS.release();
653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new implicit cast expression.
670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new implicit cast without any semantic analysis.
672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr, bool isLvalue) {
675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ImplicitCastExpr *ICE
676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (getSema().Context) ImplicitCastExpr(T, Kind,
677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 (Expr *)SubExpr.release(),
678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 isLvalue);
679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(ICE);
680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType ExplicitTy,
688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCastExpr(/*Scope=*/0,
691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   LParenLoc,
692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   ExplicitTy.getAsOpaquePtr(),
693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc,
694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(SubExpr));
695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T,
703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          RParenLoc, move(Init));
707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              tok::period, AccessorLoc,
719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Accessor,
720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RBraceLoc) {
730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis, using the name of the label
784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// operator call into a use of a builtin operator, performing
833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "named" cast expression, such as static_cast or
842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   RAngleLoc, LParenLoc,
859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    RAngleLoc, LParenLoc,
864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RAngleLoc, LParenLoc,
869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move(SubExpr),
870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   RAngleLoc, LParenLoc,
875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            QualType T,
892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             QualType T,
908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                QualType T,
955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *Sub = SubExpr.takeAs<Expr>();
959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Sema::MultiExprArg(getSema(),
963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                  (void **)&Sub,
964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                  1),
965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               /*CommaLocs=*/0,
966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// semantic analysis. Subclasses may override this routine to provide
1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      QualType ThisType) {
1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
1024f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(), LParenLoc,
1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               MultiExprArg(getSema(), 0, 0),
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ conditional declaration expression.
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation EqLoc,
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               VarDecl *Var) {
1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    EqLoc,
1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    Var));
1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool ParenTypeId,
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait 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 RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new qualified declaration reference expression.
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS,
1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceRange QualifierRange,
1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               NamedDecl *ND,
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation Location,
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               bool IsAddressOfOperand) {
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Location,
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ND->getDeclName(),
1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*Trailing lparen=*/false,
1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              &SS,
1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              IsAddressOfOperand);
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new (previously unresolved) declaration reference
1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                bool IsAddressOfOperand) {
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Location,
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Name,
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*Trailing lparen=*/false,
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              &SS,
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              IsAddressOfOperand);
1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTemplateIdExpr(TemplateName Template,
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation TemplateLoc,
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LAngleLoc,
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgument *TemplateArgs,
1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         unsigned NumTemplateArgs,
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RAngleLoc) {
1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildTemplateIdExpr(Template, TemplateLoc,
1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         LAngleLoc,
1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgs, NumTemplateArgs,
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         RAngleLoc);
1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction 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 RebuildCXXConstructExpr(QualType T,
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumArgs = Args.size();
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **ArgsExprs = (Expr **)Args.release();
1176089c2602ebaccdda271beaabdd32575b354d4d09Anders Carlsson    return getSema().Owned(SemaRef.BuildCXXConstructExpr(T, Constructor,
1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                         IsElidable,
1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                         ArgsExprs,
1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                         NumArgs));
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction 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 RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12230dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation MemberLoc) {
12280dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor    OwningExprResult Base = move(BaseE);
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Base = SemaRef.ActOnCXXEnterMemberScope(0, SS, move(Base), OpKind);
1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Base.isInvalid())
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Name.getAsIdentifierInfo() &&
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor           "Cannot transform member references with non-identifier members");
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Base = SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(Base), OperatorLoc, OpKind,
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MemberLoc,
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            *Name.getAsIdentifierInfo(),
1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.ActOnCXXExitMemberScope(0, SS);
1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Base);
1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             RParenLoc));
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    const IdentifierInfo &Name
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *Callee
1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          BuiltinLoc, false, false);
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build the CallExpr
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1315670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    bool isAddressOfOperand) {
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1330657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1331657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1332657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1333dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1334dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1335dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                     SourceRange Range) {
1336dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Instantiate the prefix of this nested name specifier.
1337dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1338dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
1339dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range);
1340dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1341dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
1342dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1343dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1344dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1345dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
1346dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    assert(Prefix &&
1347dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor           "Can't have an identifier nested-name-specifier with no prefix");
1348dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix())
1349dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
1350dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1351dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1352dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   *NNS->getAsIdentifier());
1353dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1354dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
1355dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    NamespaceDecl *NS
1356dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
1357dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                            getDerived().TransformDecl(NNS->getAsNamespace()));
1358dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1359dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1360dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1361dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
1362dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1363dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1364dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1365dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1366dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1367dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1368dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1369dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
1370dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1371dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1372dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1373dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1374d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1375d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
1376d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1377dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1378dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1379dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1380dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
1381dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1382dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1383dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1384dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   T);
1385dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1386dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1387dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1388dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
1389dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
1390dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1391dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1392dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
1393d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName
1394d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name) {
1395d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
1396d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    NestedNameSpecifier *NNS
1397d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1398d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1399d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1400d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
1401d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1402d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
1403d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      TemplateDecl *TransTemplate
1404d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1405d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1406d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
1407d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1408d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1409d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1410d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1411d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
1412d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1413d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1414d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1415d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
1416d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1417d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1418d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    assert(Ovl && "Not a template name or an overload set?");
1419d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    OverloadedFunctionDecl *TransOvl
1420d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1421d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransOvl)
1422d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
1423d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1424d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1425d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        NNS == QTN->getQualifier() &&
1426d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransOvl == Ovl)
1427d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
1428d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1429d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1430d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TransOvl);
1431d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
1432d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1433d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
1434d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    NestedNameSpecifier *NNS
1435d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1436d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1437d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1438d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
1439d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1440d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1441d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        NNS == DTN->getQualifier())
1442d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
1443d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1444d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return getDerived().RebuildTemplateName(NNS, *DTN->getName());
1445d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
1446d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1447d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
1448d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    TemplateDecl *TransTemplate
1449d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1450d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1451d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
1452d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1453d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1454d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1455d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
1456d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1457d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1458d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
1459d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1460d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1461d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  assert(Ovl && "Not a template name or an overload set?");
1462d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  OverloadedFunctionDecl *TransOvl
1463d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1464d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!TransOvl)
1465d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName();
1466d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1467d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1468d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      TransOvl == Ovl)
1469d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return Name;
1470d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1471d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return TemplateName(TransOvl);
1472d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1473d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1474d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
1475670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTemplateArgument
1476670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) {
1477670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1478670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
1479670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1480670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return Arg;
1481670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1482670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1483670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    QualType T = getDerived().TransformType(Arg.getAsType());
1484670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (T.isNull())
1485670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1486670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(Arg.getLocation(), T);
1487670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1488670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1489670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1490670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1491670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (!D)
1492670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1493670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(Arg.getLocation(), D);
1494670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1495670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1496670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
1497670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
1498670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(getSema(),
1499670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
1500670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1501670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr());
1502670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (E.isInvalid())
1503670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1504670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(E.takeAs<Expr>());
1505670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1506670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1507670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
1508670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1509670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
1510670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
1511670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
1512670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
1513670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      TemplateArgument TA = getDerived().TransformTemplateArgument(*A);
1514670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      if (TA.isNull())
1515670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor        return TA;
1516670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1517670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      TransformedArgs.push_back(TA);
1518670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
1519670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
1520670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
1521670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
1522670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return Result;
1523670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1524670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1525670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1526670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
1527670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  return TemplateArgument();
1528670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
1529670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
1531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
1532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
1533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) {
1536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
1537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
1538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Result;
1540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  switch (T->getTypeClass()) {
1541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT)
1542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT)                                                  \
1543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    case Type::CLASS:                                                        \
1544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Result = getDerived().Transform##CLASS##Type(                          \
1545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  static_cast<CLASS##Type*>(T.getTypePtr())); \
1546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
1547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "clang/AST/TypeNodes.def"
1548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
1549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Result.isNull() || T == Result)
1551577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return Result;
1552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().AddTypeQualifiers(Result, T.getCVRQualifiers());
1554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::AddTypeQualifiers(QualType T, unsigned CVRQualifiers) {
1559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (CVRQualifiers && !T->isFunctionType() && !T->isReferenceType())
1560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.getWithAdditionalQualifiers(CVRQualifiers);
1561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return T;
1563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
15641bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
1565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformExtQualType(const ExtQualType *T) {
1567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
1568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) {
1573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // Nothing to do
1574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFixedWidthIntType(
1579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const FixedWidthIntType *T) {
1580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
1581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) {
1586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
1587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) {
1592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
1598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildPointerType(PointeeType);
1601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) {
1606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
1612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildBlockPointerType(PointeeType);
1615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformLValueReferenceType(
1620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               const LValueReferenceType *T) {
1621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
1627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildLValueReferenceType(PointeeType);
1630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformRValueReferenceType(
1635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              const RValueReferenceType *T) {
1636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
1642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildRValueReferenceType(PointeeType);
1645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) {
1650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0));
1655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
1656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType() &&
1660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ClassType == QualType(T->getClass(), 0))
1661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildMemberPointerType(PointeeType, ClassType);
1664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) {
1669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
1675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildConstantArrayType(ElementType,
1678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSizeModifier(),
1679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSize(),
1680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getIndexTypeQualifier());
1681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayWithExprType(
1686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      const ConstantArrayWithExprType *T) {
1687577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1688577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1691670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
1692670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1693670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1694670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1695670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  if (Size.isInvalid())
1696670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return QualType();
1697670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1699670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      ElementType == T->getElementType() &&
1700670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      Size.get() == T->getSizeExpr())
1701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildConstantArrayWithExprType(ElementType,
1704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getSizeModifier(),
1705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getSize(),
1706670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                       Size.takeAs<Expr>(),
1707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   T->getIndexTypeQualifier(),
1708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getBracketsRange());
1709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayWithoutExprType(
1714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      const ConstantArrayWithoutExprType *T) {
1715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1718577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1719577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1720577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
1721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1722577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildConstantArrayWithoutExprType(ElementType,
1724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getSizeModifier(),
1725577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       T->getSize(),
1726577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                    T->getIndexTypeQualifier());
1727577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1728577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1729577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1730577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
1731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              const IncompleteArrayType *T) {
1732577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1733577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1735577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1736577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
1738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1739577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1740577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildIncompleteArrayType(ElementType,
1741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 T->getSizeModifier(),
1742577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 T->getIndexTypeQualifier());
1743577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1744577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1745577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1746577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVariableArrayType(
1747577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const VariableArrayType *T) {
1748577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1749577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1751577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1752670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
1753670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1754670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1755577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1756577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
1757577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1758577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1759577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1760577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
1761577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
1762577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
1763577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
1765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildVariableArrayType(ElementType,
1767577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSizeModifier(),
1768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               move(Size),
1769577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getIndexTypeQualifier(),
1770577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getBracketsRange());
1771577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1772577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1773577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1774577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedArrayType(
1775577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          const DependentSizedArrayType *T) {
1776577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1777577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1778577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1779577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1780670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
1781670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1782670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1783577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
1785577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1786577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1788577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
1789577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
1790577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
1791577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1792577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
1793577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1794577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildDependentSizedArrayType(ElementType,
1795577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     T->getSizeModifier(),
1796577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     move(Size),
1797577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     T->getIndexTypeQualifier(),
1798577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     T->getBracketsRange());
1799577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1800577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1801577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1802577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
1803577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      const DependentSizedExtVectorType *T) {
1804577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1805577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1807577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1808670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
1809670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1810670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1811577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
1812577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
1813577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1814577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1815577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
1817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
1818577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
1819577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1820577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
1821577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1822577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildDependentSizedExtVectorType(ElementType,
1823577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
1824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
1825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1827577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1828577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) {
1829577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1830577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1832577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1833577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1834577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
1835577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1836577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1837577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildVectorType(ElementType, T->getNumElements());
1838577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1839577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1840577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1841577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
1842577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) {
1843577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
1844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
1845577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1846577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1847577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1848577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
1849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1851577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(),
1852577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           /*FIXME*/SourceLocation());
1853577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1855577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1856577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionProtoType(
1857577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const FunctionProtoType *T) {
1858577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ResultType = getDerived().TransformType(T->getResultType());
1859577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ResultType.isNull())
1860577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1862577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<QualType, 4> ParamTypes;
1863577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
1864577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ParamEnd = T->arg_type_end();
1865577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor       Param != ParamEnd; ++Param) {
1866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    QualType P = getDerived().TransformType(*Param);
1867577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (P.isNull())
1868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
1869577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1870577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    ParamTypes.push_back(P);
1871577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
1872577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1873577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1874577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ResultType == T->getResultType() &&
1875577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin()))
1876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1878577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(),
1879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               ParamTypes.size(), T->isVariadic(),
1880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getTypeQuals());
1881577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
1885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                const FunctionNoProtoType *T) {
1886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
1887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1888577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1889577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1890577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) {
1892577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
1893577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
1894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
1895577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1896577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1898577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Typedef == T->getDecl())
1899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1900577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1901577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypedefType(Typedef);
1902577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1904577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfExprType(
1906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                    const TypeOfExprType *T) {
1907670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
1908670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1909670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1910577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
1911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
1912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1914577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      E.get() == T->getUnderlyingExpr()) {
1916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    E.take();
1917577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1918577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
1919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1920577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypeOfExprType(move(E));
1921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1924577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) {
1925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
1926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Underlying.isNull())
1927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1928577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1929577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Underlying == T->getUnderlyingType())
1931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypeOfType(Underlying);
1934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1936577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) {
1938670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
1939670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
1940670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
1942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
1943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1945577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      E.get() == T->getUnderlyingExpr()) {
1947577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    E.take();
1948577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1949577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
1950577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildDecltypeType(move(E));
1952577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) {
1956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
1957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
1958577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
1959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1960577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Record == T->getDecl())
1963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildRecordType(Record);
1966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) {
1970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
1971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
1972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
1973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Enum == T->getDecl())
1977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1978577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildEnumType(Enum);
1980577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1982577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
1984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              const TemplateTypeParmType *T) {
1985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // Nothing to do
1986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
1987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1990577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
1991577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        const TemplateSpecializationType *T) {
1992577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TemplateName Template
1993577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName());
1994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
1995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
1996577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1997577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs;
1998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NewTemplateArgs.reserve(T->getNumArgs());
1999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
2000577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor       Arg != ArgEnd; ++Arg) {
2001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg);
2002577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewArg.isNull())
2003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2005577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    NewTemplateArgs.push_back(NewArg);
2006577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2007577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2008577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: early abort if all of the template arguments and such are the
2009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // same.
2010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: We're missing the locations of the template name, '<', and '>'.
2012577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTemplateSpecializationType(Template,
2013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        NewTemplateArgs.data(),
2014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        NewTemplateArgs.size());
2015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2016577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2018577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformQualifiedNameType(
2019577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const QualifiedNameType *T) {
2020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2021577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                SourceRange());
2023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2026577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      NNS == T->getQualifier() &&
2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Named == T->getNamedType())
2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildQualifiedNameType(NNS, Named);
2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2039577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) {
2040577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2041577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
20424a959d8788179d654df6b213b08d2b064989211dDouglas Gregor                        SourceRange(/*FIXME:*/getDerived().getBaseLocation()));
2043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2045577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
2047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    QualType NewTemplateId
2048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
2049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
2050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2052577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
2055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return getDerived().RebuildTypenameType(NNS, NewTemplateId);
2058577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypenameType(NNS, T->getIdentifier());
2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2062577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCInterfaceType(
2065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const ObjCInterfaceType *T) {
2066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
2067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2069577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2071577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCObjectPointerType(
2072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             const ObjCObjectPointerType *T) {
2073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
2074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return QualType(T, 0);
2075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
2079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
2083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
2089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NamedDecl *ND
2090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
2091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
2092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && ND == E->getDecl())
2095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDeclRefExpr(ND, E->getLocation());
2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
2103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
2109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
2115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
2121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
2127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
2133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
2138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
2141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
2142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
2147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
2152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
2155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
2156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
2157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
2162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
2163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getArgumentType());
2164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
2165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
2168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
2169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
2171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->isSizeOf(),
2172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
2173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
2176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
2177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
2178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
2179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
2180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
2183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
2184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
2187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
2188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
2191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
2192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
2193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
2198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
2200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
2204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
2209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
2210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
2213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
2214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
2215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
2216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
2221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
2222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
2223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
2224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
2227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
2228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
2229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
2230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
2231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
2232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
2233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
2236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
2237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
2238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
2240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
2241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
2245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
2246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
2249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
2250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
2251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
2252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
2253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
2254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
2255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
2260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
2261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
2262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NamedDecl *Member
2265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
2266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
2267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
2271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Member == E->getMemberDecl())
2272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
2275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
2276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
2277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
2279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
2280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
2281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        Member);
2282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
2287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
2288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
2294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
2296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
2300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
2304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
2305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
2308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
2309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
2314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CompoundAssignOperator *E) {
2315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformBinaryOperator(E);
2316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
2321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
2322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
2323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
2327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
2331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
2335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
2336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
2337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXM: ? and : locations are broken.
2340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeQuestionLoc = E->getCond()->getLocEnd();
2341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeColonLoc = E->getFalseExpr()->getLocStart();
2342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildConditionalOperator(move(Cond),
2343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 FakeQuestionLoc,
2344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(LHS),
2345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 FakeColonLoc,
2346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
2347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
2352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
2353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
2354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
2362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
2363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
2366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
2367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->isLvalueCast());
2368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
2373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
2374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
2380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
2381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
2382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
2383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation TypeStartLoc
2384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
2385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
2386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getTypeAsWritten());
2388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
2389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
2398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
2399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
2402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
2403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
2404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
2409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
2410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
2411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
2412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation FakeTypeLoc
2413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
2414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
2415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
2417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
2418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
2422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
2423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
2427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
2428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
2431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
2432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
2433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
2438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
2439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
2440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
2444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
2447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
2448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
2449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
2450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
2451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
2452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
2457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
2458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
2460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
2461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
2462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
2463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
2466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
2467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
2470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
2473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRBraceLoc());
2474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
2479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
2480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Instantiate the initializer value
2482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
2483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
2484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Instantiate the designators.
2487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
2488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
2489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
2490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
2491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
2492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
2493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
2494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
2495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
2496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
2497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
2498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
2500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
2501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
2502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
2503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getArray(Index.get(),
2505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
2506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
2508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
2509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
2510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
2511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
2513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Start
2514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
2515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
2516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
2519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
2520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
2523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
2524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
2525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
2526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
2528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
2529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
2531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
2532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
2536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
2537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
2540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
2541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
2542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
2547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    ImplicitValueInitExpr *E) {
2548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
2549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
2550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
2554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
2557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
2562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
2563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
2564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
2566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
2567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
2568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
2569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
2570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
2579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
2580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
2583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
2584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
2589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
2590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
2591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
2592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
2593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
2594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
2597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
2598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
2601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
2602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
2603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
2606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
2607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
2608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
2609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
2610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
2613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
2614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
2615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
2619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult SubStmt
2620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
2621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
2622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
2626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
2629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
2630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
2631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
2636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
2637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
2638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
2639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
2640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
2642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
2643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
2646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
2647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
2652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
2653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
2656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
2657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
2662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
2663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
2664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
2667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
2668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
2671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
2672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
2676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
2677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
2678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
2681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
2682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
2683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
2688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
2694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
2695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
2696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
2699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
2700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
2703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
2704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
2705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
2706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
2711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
2712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
2713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
2716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
2717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Callee),
2718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
2719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
2720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
2725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCallExpr(E);
2726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
2731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
2732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
2733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
2734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation TypeStartLoc
2735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
2736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
2737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
2739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
2740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
2749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
2750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
2753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLAngleLoc
2754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
2755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
2756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
2757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
2758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
2759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
2760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getStmtClass(),
2761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
2762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExplicitTy,
2763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
2764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
2765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
2766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
2767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
2772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
2773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
2778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
2779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
2784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                CXXReinterpretCastExpr *E) {
2785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
2786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
2791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
2792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
2797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   CXXFunctionalCastExpr *E) {
2798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
2799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
2800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
2801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
2803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
2804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
2813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
2814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
2817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
2818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
2819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExplicitTy,
2820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
2821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
2822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
2823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
2828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
2829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
2830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
2832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
2833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
2836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
2837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
2838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
2840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
2841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
2842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
2843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
2846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
2847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
2848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef,
2849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
2850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
2852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
2857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
2860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
2861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
2862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
2863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
2868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
2874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CXXNullPtrLiteralExpr *E) {
2875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
2876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
2881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
2882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
2884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
2885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
2889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
2892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
2897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
2903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
2906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
2911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ParmVarDecl *Param
2912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
2913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
2914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (getDerived().AlwaysRebuild() &&
2917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
2918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(Param);
2921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
2926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
2927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
2929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
2930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
2934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
2937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
2938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
2939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
2940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
2945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  VarDecl *Var
2946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<VarDecl>(getDerived().TransformDecl(E->getVarDecl()));
2947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Var)
2948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Var == E->getVarDecl())
2952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
2953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
2955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  /*FIXME:*/E->getStartLoc(),
2956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  Var);
2957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
2960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
2961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
2962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
2963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
2964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
2965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
2966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
2969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
2970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
2971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
2972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
2974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
2975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
2976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
2977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
2978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
2979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
2982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
2983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Instantiate the constructor arguments (if any).
2986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
2987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
2988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
2989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
2990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
2991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
2993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
2994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
2995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
2996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
2997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
2998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
2999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
3000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
3003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
3004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
3006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
3008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
3009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
3011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
3012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
3014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getLocEnd());
3015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
3020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
3021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
3022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Operand.get() == E->getArgument())
3026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
3029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
3030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
3031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
3032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
3037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              UnresolvedFunctionNameExpr *E) {
3038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // There is no transformation we can apply to an unresolved function name.
3039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
3045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
3048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
3053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
3056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
3057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
3058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
3060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
3061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
3062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
3063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
3064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
3069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
3070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getQualifierRange());
3072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
3073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NamedDecl *ND
3076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      NNS == E->getQualifier() &&
3082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ND == E->getDecl())
3083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildQualifiedDeclRefExpr(NNS,
3086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getQualifierRange(),
3087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  ND,
3088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getLocation(),
3089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  /*FIXME:*/false);
3090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
3095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    UnresolvedDeclRefExpr *E) {
3096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
3097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getQualifierRange());
3099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
3100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Transform the declaration name
3103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  DeclarationName Name = E->getDeclName();
3104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      NNS == E->getQualifier() &&
3107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Name == E->getDeclName())
3108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
3111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getQualifierRange(),
3112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   Name,
3113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getLocation(),
3114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   /*FIXME:*/false);
3115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
3120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemplateName Template
3121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformTemplateName(E->getTemplateName());
3122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Template.isNull())
3123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<TemplateArgument, 4> TransArgs;
3126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemplateArgument TransArg
3128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
3129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isNull())
3130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TransArgs.push_back(TransArg);
3133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
3136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // compare template arguments (yet).
3137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: It's possible that we'll find out now that the template name
3139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // actually refers to a type, in which case the caller is actually dealing
3140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // with a functional cast. Give a reasonable error message!
3141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
3142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLAngleLoc(),
3143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.data(),
3144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.size(),
3145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRAngleLoc());
3146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
3151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
3152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
3158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
3159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                              getDerived().TransformDecl(E->getConstructor()));
3160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
3161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
3166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
3167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
3168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
3170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
3174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
3179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
3180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
3183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
3184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
3187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
3188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// The transformation of a temporary-binding expression always attempts to
3189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// bind a new temporary variable to its subexpression, even if the
3190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself
3191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique.
3192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
3195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
3200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ expression that contains temporaries that should
3203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
3204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
3205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// The transformation of a full expression always attempts to build a new
3206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// CXXExprWithTemporaries expression, even if the
3207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the
3208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression.
3209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
3212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                CXXExprWithTemporaries *E) {
3213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(
3218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor           SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
3219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->shouldDestroyTemporaries()));
3220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
3225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CXXTemporaryObjectExpr *E) {
3226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
3232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
3233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                            getDerived().TransformDecl(E->getConstructor()));
3234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
3235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
3240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
3241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
3242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
3243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
3245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
3249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
3254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
3255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
3258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
3259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
3260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
3261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CommaLoc
3262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
3263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
3265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
3266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
3267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
3268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
3269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
3270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
3275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            CXXUnresolvedConstructExpr *E) {
3276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
3278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
3284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
3285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
3286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
3287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
3288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
3289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
3292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
3294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
3295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
3299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
3300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
3303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
3304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
3305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
3306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
3307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
3308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
3309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
3314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CXXUnresolvedMemberExpr *E) {
3315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
3316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Transform the declaration name
3321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  DeclarationName Name = E->getMember();
3322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
3325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Name == E->getMember())
3326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
3329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
3330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
3331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getMember(),
3332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getMemberLoc());
3333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
3338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
3344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
3345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
3346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
3347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
3348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
3352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
3355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
3356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
3357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
3362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
3363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
3364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
3370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
3376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ObjCProtocolDecl *Protocol
3377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
3378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                getDerived().TransformDecl(E->getProtocol()));
3379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
3380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
3384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
3387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
3388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
3389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
3390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
3391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
3397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
3398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
3399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
3405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
3406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
3407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3412154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz JahanianTreeTransform<Derived>::TransformObjCImplctSetterGetterRefExpr(
3413154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian                                          ObjCImplctSetterGetterRefExpr *E) {
3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
3416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
3422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
3423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
3424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
3430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
3431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
3432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
3438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
3440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
3442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
3443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
3446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
3447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
3451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
3452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
3455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
3456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
3461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
3463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
3469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
3470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
3471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
3472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
3475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
3477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
3480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.BuildPointerType(PointeeType, 0,
3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseLocation(),
3482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.BuildBlockPointerType(PointeeType, 0,
3488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseLocation(),
3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
3490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType
3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
3495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.BuildReferenceType(ReferentType, true, 0,
3496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    getDerived().getBaseLocation(),
3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    getDerived().getBaseEntity());
3498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType
3502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
3503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildReferenceType(ReferentType, false, 0,
3504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    getDerived().getBaseLocation(),
3505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    getDerived().getBaseEntity());
3506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
3510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          QualType ClassType) {
3511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 0,
3512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        getDerived().getBaseLocation(),
3513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        getDerived().getBaseEntity());
3514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
3518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
3519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
3520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
3521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
3522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
3523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
3524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
3525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
3526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
3527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
3528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Types[] = {
3530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
3531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
3532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
3533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
3534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
3535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
3536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
3537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
3538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
3539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
3540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
3541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeType.isNull())
3543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
3544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
3546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
3547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
3548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                getDerived().getBaseEntity());
3549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3551577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
3553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
3554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
3555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
3556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals) {
3557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
3558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        IndexTypeQuals, SourceRange());
3559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
3563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayWithExprType(QualType ElementType,
3564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
3565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      const llvm::APInt &Size,
3566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         Expr *SizeExpr,
3567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned IndexTypeQuals,
3568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                    SourceRange BracketsRange) {
3569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
3570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
3571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
3575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayWithoutExprType(
3576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        QualType ElementType,
3577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
3578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       const llvm::APInt &Size,
3579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     unsigned IndexTypeQuals) {
3580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
3581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, SourceRange());
3582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
3586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
3587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
3588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals) {
3589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
3590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, SourceRange());
3591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
3595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
3596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
3598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
3599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
3600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
3601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
3602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
3603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
3607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
3608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
3610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
3611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
3612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
3613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
3614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
3615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
3619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   unsigned NumElements) {
3620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
3621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getVectorType(ElementType, NumElements);
3622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
3626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
3627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
3628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
3629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
3630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
3631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
3632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
3633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
3634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
3635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType
3639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
3641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
3642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
3643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
3647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          QualType *ParamTypes,
3648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
3649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          bool Variadic,
3650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
3651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
3652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
3653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
3654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
3655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
3659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
3660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
3664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
3665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
3669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
3670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
3673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
3674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        TemplateName Template,
3675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const TemplateArgument *Args,
3676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                           unsigned NumArgs) {
3677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Missing source locations for the template name, <, >.
3678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(),
3679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                     SourceLocation(), Args, NumArgs,
3680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                     SourceLocation());
3681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
3682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3683dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
3684dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
3685dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
3686dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
3687dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   IdentifierInfo &II) {
3688dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
3689dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
3690dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
3691dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
3692dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
3693dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                    SemaRef.ActOnCXXNestedNameSpecifier(0, SS, Range.getEnd(),
3694dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                        Range.getEnd(), II));
3695dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
3696dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
3697dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
3698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
3699dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
3700dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
3701dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
3702dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
3703dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
3704dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
3705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
3706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
3707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
3708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
3709dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
3710dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   QualType T) {
3711dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (T->isDependentType() || T->isRecordType() ||
3712dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
3713dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here");
3714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
3715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
3716dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
3717dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
3718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
3719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
3720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
3721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
3722d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
3723d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName
3724d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
3725d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
3726d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
3727d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
3728d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
3729d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
3730d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
3731d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
3732d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName
3733d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
3734d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
3735d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            OverloadedFunctionDecl *Ovl) {
3736d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
3737d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
3738d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
3739d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
3740d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName
3741d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
3742d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            const IdentifierInfo &II) {
3743d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (Qualifier->isDependent())
3744d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return SemaRef.Context.getDependentTemplateName(Qualifier, &II);
3745d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
3746d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  // Somewhat redundant with ActOnDependentTemplateName.
3747d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
3748d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
3749d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setScopeRep(Qualifier);
3750d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  Sema::TemplateTy Template;
3751d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateNameKind TNK = SemaRef.isTemplateName(II, 0, Template, &SS);
3752d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TNK == TNK_Non_template) {
3753d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    SemaRef.Diag(getDerived().getBaseLocation(),
3754d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                 diag::err_template_kw_refers_to_non_template)
3755d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      << &II;
3756d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName();
3757d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  } else if (TNK == TNK_Function_template) {
3758d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    SemaRef.Diag(getDerived().getBaseLocation(),
3759d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                 diag::err_template_kw_refers_to_non_template)
3760d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      << &II;
3761d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName();
3762d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
3763d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
3764d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return Template.getAsVal<TemplateName>();
3765d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SecondExpr == 0 || isPostIncDec) {
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      UnaryOperator::Opcode Opc
3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType() &&
3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Result
3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Compute the transformed set of functions (and function templates) to be
3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::FunctionSet Functions;
3808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  DeclRefExpr *DRE = cast<DeclRefExpr>((Expr *)Callee.get());
3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OverloadedFunctionDecl *Overloads
3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast<OverloadedFunctionDecl>(DRE->getDecl());
3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we have to check
3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // IsAcceptableNonMemberOperatorCandidate for each of these?
3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (OverloadedFunctionDecl::function_iterator
3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       F = Overloads->function_begin(),
3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       FEnd = Overloads->function_end();
3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       F != FEnd; ++F)
3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Functions.insert(*F);
3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  DeclarationName OpName
3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions);
3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    UnaryOperator::Opcode Opc
3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
3833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  BinaryOperator::Opcode Opc =
3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Result
3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return move(Result);
3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
3848577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
3849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
3851