TreeTransform.h revision 49a832bd499d6f61c23655f1fac99f0dd229756e
1577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===------- TreeTransform.h - Semantic Tree Transformation ---------------===/
2577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
3577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//                     The LLVM Compiler Infrastructure
4577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
5577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file is distributed under the University of Illinois Open Source
6577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// License. See LICENSE.TXT for details.
7577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
8577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
9577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  This file implements a semantic tree transformation that takes a given
10577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//  AST and rebuilds it, possibly transforming some nodes in the process.
11577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//
12577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/
13577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H
15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "Sema.h"
17dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h"
18c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h"
19657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h"
20b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h"
21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h"
2243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h"
2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h"
2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h"
25b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h"
26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h"
27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h"
28577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm>
29577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang {
311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one
33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another.
34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of
361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template
38577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the
39577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the
40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar
41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and
42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters.
43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can
46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an
47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The
48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual.
49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which
51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node
52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions,
53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST
54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation
55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g.,
56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes
57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create
58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node.
59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The
61670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(),
62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely
64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations.
65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the
67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
6843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation
701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template
71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX
72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change.
73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild
74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may
75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps.
76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor///
77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one
781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation
79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the
81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking
82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()).
83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform {
85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected:
86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &SemaRef;
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic:
89b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningStmtResult OwningStmtResult;
90b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::OwningExprResult OwningExprResult;
91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::StmtArg StmtArg;
92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::ExprArg ExprArg;
93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  typedef Sema::MultiExprArg MultiExprArg;
9443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  typedef Sema::MultiStmtArg MultiStmtArg;
951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
96577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Initializes a new tree transformer.
97577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Derived &getDerived() { return static_cast<Derived&>(*this); }
101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the derived class.
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const Derived &getDerived() const {
1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return static_cast<const Derived&>(*this);
105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Retrieves a reference to the semantic analysis object used for
108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this tree transform.
109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema &getSema() const { return SemaRef; }
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Whether the transformation should always rebuild AST nodes, even
112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// if none of the children have changed.
113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this function to specify when the transformation
115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// should rebuild all AST nodes.
116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlwaysRebuild() { return false; }
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the location of the entity being transformed, if that
119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, returns no source-location information. Subclasses can
122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// provide an alternative implementation that provides better location
123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information.
124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  SourceLocation getBaseLocation() { return SourceLocation(); }
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Returns the name of the entity being transformed, if that
127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// information was not available elsewhere in the AST.
128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, returns an empty name. Subclasses can provide an alternative
130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// implementation with a more precise name.
131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  DeclarationName getBaseEntity() { return DeclarationName(); }
132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Sets the "base" location and entity when that
134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// information is known based on another transformation.
135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, the source location and entity are ignored. Subclasses can
137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// override this function to provide a customized implementation.
138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  void setBase(SourceLocation Loc, DeclarationName Entity) { }
1391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief RAII object that temporarily sets the base location and entity
141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// used for reporting diagnostics in types.
142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  class TemporaryBase {
143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TreeTransform &Self;
144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SourceLocation OldLocation;
145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclarationName OldEntity;
1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  public:
148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase(TreeTransform &Self, SourceLocation Location,
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  DeclarationName Entity) : Self(Self) {
150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldLocation = Self.getDerived().getBaseLocation();
151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OldEntity = Self.getDerived().getBaseEntity();
152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(Location, Entity);
153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ~TemporaryBase() {
156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Self.getDerived().setBase(OldLocation, OldEntity);
157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  };
1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Determine whether the given type \p T has already been
161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformed.
162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses can provide an alternative implementation of this routine
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// to short-circuit evaluation when it is known that a given type will
165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not change. For example, template instantiation need not traverse
166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// non-dependent types.
167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  bool AlreadyTransformed(QualType T) {
168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T.isNull();
169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transforms the given type into another type.
172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, this routine transforms a type by delegating to the
1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// appropriate TransformXXXType to build a new type, then applying
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// the qualifiers on \p T to the resulting type with AddTypeQualifiers.
1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Subclasses may override this function (to take over all type
177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// transformations), some set of the TransformXXXType functions, or
178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// the AddTypeQualifiers function to alter the transformation.
179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \returns the transformed type.
181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType TransformType(QualType T);
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given type by adding the given set of qualifiers
184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// and returning the result.
185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// FIXME: By default, this routine adds type qualifiers only to types that
187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// can have qualifiers, and silently suppresses those qualifiers that are
188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// not permitted (e.g., qualifiers on reference or function types). This
189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// is the right thing for template instantiation, but probably not for
190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// other clients.
1910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  QualType AddTypeQualifiers(QualType T, Qualifiers Qs);
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
193657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given statement.
194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this routine transforms a statement by delegating to the
19643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// appropriate TransformXXXStmt function to transform a specific kind of
19743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// statement or the TransformExpr() function to transform an expression.
19843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to transform statements using some
19943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// other mechanism.
20043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
20143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \returns the transformed statement.
202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningStmtResult TransformStmt(Stmt *S);
2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
204657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  /// \brief Transform the given expression.
205657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor  ///
206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E) {
213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Transform the given expression.
217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine transforms an expression by delegating to the
219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// appropriate TransformXXXExpr function to build a new expression.
220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this function to transform expressions using some
221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// other mechanism.
222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \returns the transformed expression.
224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
2251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given declaration, which is referenced from a type
227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// or expression.
228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
229dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, acts as the identity function on declarations. Subclasses
230dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// may override this function to provide alternate behavior.
231dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  Decl *TransformDecl(Decl *D) { return D; }
23243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
23343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Transform the definition of the given declaration.
23443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, invokes TransformDecl() to transform the declaration.
23643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
23743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); }
2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given nested-name-specifier.
240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, transforms all of the types and declarations within the
242dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this function to provide
243dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// alternate behavior.
244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
245a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                    SourceRange Range,
246c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              QualType ObjectType = QualType(),
247c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                          NamedDecl *FirstQualifierInScope = 0);
2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// \brief Transform the given declaration name.
25081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  ///
25181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// By default, transforms the types of conversion function, constructor,
25281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// and destructor names and then (if needed) rebuilds the declaration name.
25381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// Identifiers and selectors are returned unmodified. Sublcasses may
25481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  /// override this function to provide alternate behavior.
25581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  DeclarationName TransformDeclarationName(DeclarationName Name,
25681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                           SourceLocation Loc);
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template name.
2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
260d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, transforms the template name by transforming the declarations
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and nested-name-specifiers that occur within the template name.
262d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// Subclasses may override this function to provide alternate behavior.
2633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName TransformTemplateName(TemplateName Name,
2643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                     QualType ObjectType = QualType());
2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Transform the given template argument.
267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, this operation transforms the type, expression, or
2691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// declaration stored within the template argument and constructs a
270670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// new template argument from the transformed result. Subclasses may
271670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  /// override this function to provide alternate behavior.
272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg);
2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT)
275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT)                                   \
276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Transform##CLASS##Type(const CLASS##Type *T);
2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "clang/AST/TypeNodes.def"
278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
27943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                        \
28243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Transform##Node(Node *S);
283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                        \
284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Transform##Node(Node *E);
285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent)
286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new pointer type given its pointee type.
289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the pointer type.
291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildPointerType(QualType PointeeType);
293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new block pointer type given its pointee type.
295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
2961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis when building the block pointer
297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildBlockPointerType(QualType PointeeType);
299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new lvalue reference type given the type it references.
301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the lvalue reference
303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildLValueReferenceType(QualType ReferentType);
305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new rvalue reference type given the type it references.
307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the rvalue reference
309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildRValueReferenceType(QualType ReferentType);
3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new member pointer type given the pointee type and the
313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// class type it refers into.
314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the member pointer
316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// type. Subclasses may override this routine to provide different behavior.
317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType);
3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new array type given the element type, size
320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// modifier, size of the array (if known), size expression, and index type
321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// qualifiers.
322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the array type.
324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// Also by default, all of the other Rebuild*Array
326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildArrayType(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);
3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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.
3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildConstantArrayType(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.
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildIncompleteArrayType(QualType ElementType,
349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      ArrayType::ArraySizeModifier SizeMod,
350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                      unsigned IndexTypeQuals);
351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \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.
3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildVariableArrayType(QualType ElementType,
358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    ArrayType::ArraySizeModifier SizeMod,
359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    ExprArg SizeExpr,
360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned IndexTypeQuals,
361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    SourceRange BracketsRange);
362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \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.
3681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  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);
3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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);
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \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.
3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildDependentSizedExtVectorType(QualType ElementType,
395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg SizeExpr,
396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                              SourceLocation AttributeLoc);
3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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,
4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    QualType *ParamTypes,
404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    unsigned NumParamTypes,
405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    bool Variadic, unsigned Quals);
4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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  }
4217da2431c23ef1ee8acb114e39692246e1801afc2John McCall
4227da2431c23ef1ee8acb114e39692246e1801afc2John McCall  /// \brief Build a new elaborated type.
4237da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
4247da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return SemaRef.Context.getElaboratedType(T, Tag);
4257da2431c23ef1ee8acb114e39692246e1801afc2John McCall  }
4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(expr) type.
428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typeof type.
430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildTypeOfExprType(ExprArg Underlying);
432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new typeof(type) type.
434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypeOfType with the given underlying type.
436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypeOfType(QualType Underlying);
437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++0x decltype type.
439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the decltype type.
441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType RebuildDecltypeType(ExprArg Underlying);
4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new template specialization type.
445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the template
447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// specialization type. Subclasses may override this routine to provide
448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTemplateSpecializationType(TemplateName Template,
450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             const TemplateArgument *Args,
451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                             unsigned NumArgs);
4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new qualified name type.
454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, builds a new QualifiedNameType type from the
4561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// nested-name-specifier and the named type. Subclasses may override
457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// this routine to provide different behavior.
458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, Named);
4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to a template-id.
463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, builds a new TypenameType type from the nested-name-specifier
4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// and the given type. Subclasses may override this routine to provide
466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NNS->isDependent())
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Context.getTypenameType(NNS,
470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          cast<TemplateSpecializationType>(T));
4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.Context.getQualifiedNameType(NNS, T);
4731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// \brief Build a new typename type that refers to an identifier.
476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  ///
477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// By default, performs semantic analysis when building the typename type
4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// (or qualified name type). Subclasses may override this routine to provide
479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  /// different behavior.
4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType RebuildTypenameType(NestedNameSpecifier *NNS,
481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                               const IdentifierInfo *Id) {
482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.CheckTypenameType(NNS, *Id,
483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  SourceRange(getDerived().getBaseLocation()));
484dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
486dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and an
487dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// identifier that names the next step in the nested-name-specifier.
488dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
489dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
490dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
491dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
492dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
493dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
494a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  IdentifierInfo &II,
495c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  QualType ObjectType,
496c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                              NamedDecl *FirstQualifierInScope);
497dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
498dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
499dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// namespace named in the next step in the nested-name-specifier.
500dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
501dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
502dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
503dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
504dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
505dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
506dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  NamespaceDecl *NS);
507dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
508dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// \brief Build a new nested-name-specifier given the prefix and the
509dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// type named in the next step in the nested-name-specifier.
510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  ///
511dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// By default, performs semantic analysis when building the new
512dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// nested-name-specifier. Subclasses may override this routine to provide
513dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  /// different behavior.
514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  SourceRange Range,
516dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  bool TemplateKW,
517dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                  QualType T);
518d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
519d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
520d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and the template
521d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// that the template name refers to.
522d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
523d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
524d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
525d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
526d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
527d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   TemplateDecl *Template);
528d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
529d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier, a flag
530d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// indicating whether the "template" keyword was provided, and a set of
531d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// overloaded function templates.
532d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
533d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, builds the new template name directly. Subclasses may override
534d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// this routine to provide different behavior.
535d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
536d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   bool TemplateKW,
537d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                   OverloadedFunctionDecl *Ovl);
5381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
539d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// \brief Build a new template name given a nested name specifier and the
540d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// name that is referred to as a template.
541d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  ///
542d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// By default, performs semantic analysis to determine whether the name can
543d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// be resolved to a specific template, then builds the appropriate kind of
544d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// template name. Subclasses may override this routine to provide different
545d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  /// behavior.
546d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
5473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   const IdentifierInfo &II,
5483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                   QualType ObjectType);
5491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
55143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new compound statement.
55243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
55343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
55443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
55543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
55643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       MultiStmtArg Statements,
55743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       SourceLocation RBraceLoc,
55843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       bool IsStmtExpr) {
55943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
56043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       IsStmtExpr);
56143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
56243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
56343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new case statement.
56443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
56543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
56643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
56743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
56843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg LHS,
56943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EllipsisLoc,
57043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ExprArg RHS,
57143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation ColonLoc) {
5721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
57343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   ColonLoc);
57443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
5751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to a new case statement.
57743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
57843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
57943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
58043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
58143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    getSema().ActOnCaseStmtBody(S.get(), move(Body));
58243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return move(S);
58343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
5841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new default statement.
58643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
58743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
58843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
5891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
59043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      SourceLocation ColonLoc,
59143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      StmtArg SubStmt) {
5921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
59343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      /*CurScope=*/0);
59443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
5951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
59643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new label statement.
59743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
59843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
59943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
60143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    IdentifierInfo *Id,
60243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceLocation ColonLoc,
60343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg SubStmt) {
60443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
60543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new "if" statement.
60843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
6121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                 StmtArg Then, SourceLocation ElseLoc,
61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 StmtArg Else) {
61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else));
61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Start building a new switch statement.
61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) {
62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnStartOfSwitchStmt(move(Cond));
62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Attach the body to the switch statement.
62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         StmtArg Switch, StmtArg Body) {
63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(Body));
63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new while statement.
63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    Sema::FullExprArg Cond,
64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    StmtArg Body) {
64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body));
64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new do-while statement.
64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation WhileLoc,
65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation LParenLoc,
65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 ExprArg Cond,
65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 SourceLocation RParenLoc) {
6541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                 move(Cond), RParenLoc);
65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new for statement.
65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
6621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation LParenLoc,
66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  StmtArg Init, ExprArg Cond, ExprArg Inc,
66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  SourceLocation RParenLoc, StmtArg Body) {
6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond),
66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                  move(Inc), RParenLoc, move(Body));
66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new goto statement.
67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation LabelLoc,
67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   LabelStmt *Label) {
67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new indirect goto statement.
68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           SourceLocation StarLoc,
68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                           ExprArg Target) {
68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new return statement.
69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     ExprArg Result) {
6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
6991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new declaration statement.
70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                   SourceLocation StartLoc,
70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                   SourceLocation EndLoc) {
70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor             new (getSema().Context) DeclStmt(
70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                        DeclGroupRef::Create(getSema().Context,
71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                             Decls, NumDecls),
71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              StartLoc, EndLoc));
71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ exception declaration.
71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new decaration.
71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                DeclaratorInfo *Declarator,
72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                IdentifierInfo *Name,
72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceLocation Loc,
72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                SourceRange TypeRange) {
7231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                               TypeRange);
72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ catch statement.
72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       VarDecl *ExceptionDecl,
73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       StmtArg Handler) {
73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().Owned(
7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump             new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                  Handler.takeAs<Stmt>()));
73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// \brief Build a new C++ try statement.
74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ///
74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// By default, performs semantic analysis to build the new statement.
74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  /// Subclasses may override this routine to provide different behavior.
74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     StmtArg TryBlock,
74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     MultiStmtArg Handlers) {
74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
7481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression that references a declaration.
750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) {
754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildDeclarationNameExpr(Loc, ND,
755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false,
756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*SS=*/0,
757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/false);
758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
7591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression in parentheses.
7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    SourceLocation RParen) {
766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
769a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// \brief Build a new pseudo-destructor expression.
7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
771a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
772a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
773a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
774a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceLocation OperatorLoc,
775a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  bool isArrow,
776a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              SourceLocation DestroyedTypeLoc,
777a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  QualType DestroyedType,
778a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                               NestedNameSpecifier *Qualifier,
779a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                  SourceRange QualifierRange) {
780a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    CXXScopeSpec SS;
781a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (Qualifier) {
782a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setRange(QualifierRange);
783a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      SS.setScopeRep(Qualifier);
784a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    }
785a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    DeclarationName Name
787a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      = SemaRef.Context.DeclarationNames.getCXXDestructorName(
788a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                               SemaRef.Context.getCanonicalType(DestroyedType));
7891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
791a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              OperatorLoc,
792a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              isArrow? tok::arrow : tok::period,
793a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              DestroyedTypeLoc,
794a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Name,
795a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              Sema::DeclPtrTy::make((Decl *)0),
796a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                              &SS);
7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary operator expression.
8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        UnaryOperator::Opcode Opc,
805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg SubExpr) {
806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new sizeof or alignof expression with a type argument.
8101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
8181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new sizeof or alignof expression with an expression
819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument.
8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool isSizeOf, SourceRange R) {
8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          OpLoc, isSizeOf, R);
828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr.release();
832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new array subscript expression.
8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LBracketLoc,
841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg RHS,
842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RBracketLoc) {
843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             LBracketLoc, move(RHS),
845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             RBracketLoc);
846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new call expression.
8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Args,
854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation *CommaLocs,
855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Args), CommaLocs, RParenLoc);
858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member access expression.
8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool isArrow,
86683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     NestedNameSpecifier *Qualifier,
86783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceRange QualifierRange,
86883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     SourceLocation MemberLoc,
869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     NamedDecl *Member) {
870d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    if (!Member->getDeclName()) {
871d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      // We have a reference to an unnamed field.
872d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      MemberExpr *ME =
875d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson        new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
876d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           Member, MemberLoc,
877d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson                                           cast<FieldDecl>(Member)->getType());
878d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson      return getSema().Owned(ME);
879d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson    }
8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
88183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    CXXScopeSpec SS;
88283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    if (Qualifier) {
88383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setRange(QualifierRange);
88483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      SS.setScopeRep(Qualifier);
88583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    }
88683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
887017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor    return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              isArrow? tok::arrow : tok::period,
889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              MemberLoc,
890017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                              Member->getDeclName(),
89183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
89283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                              &SS);
893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
8941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new binary operator expression.
8961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         BinaryOperator::Opcode Opc,
901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg LHS, ExprArg RHS) {
902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     (Expr *)RHS.get());
905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    LHS.release();
909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    RHS.release();
910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new conditional operator expression.
9141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildConditionalOperator(ExprArg Cond,
918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation QuestionLoc,
919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg LHS,
920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation ColonLoc,
921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg RHS) {
9221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(LHS), move(RHS));
924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new implicit cast expression.
9271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new implicit cast without any semantic analysis.
929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr, bool isLvalue) {
932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ImplicitCastExpr *ICE
9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      = new (getSema().Context) ImplicitCastExpr(T, Kind,
934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 (Expr *)SubExpr.release(),
935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 isLvalue);
936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(ICE);
937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C-style cast expression.
9401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType ExplicitTy,
945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc,
946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ExprArg SubExpr) {
947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCastExpr(/*Scope=*/0,
948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   LParenLoc,
949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   ExplicitTy.getAsOpaquePtr(),
950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc,
951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(SubExpr));
952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new compound literal expression.
9551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T,
960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc,
961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Init) {
962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          RParenLoc, move(Init));
964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new extended vector element access expression.
9671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
9701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation OpLoc,
972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation AccessorLoc,
973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               IdentifierInfo &Accessor) {
974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              tok::period, AccessorLoc,
976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Accessor,
977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new initializer list expression.
9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   MultiExprArg Inits,
986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RBraceLoc) {
987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
9891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new designated initializer expression.
9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             MultiExprArg ArrayExprs,
996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation EqualOrColonLoc,
997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             bool GNUSyntax,
998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg Init) {
999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result
1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Init));
1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
10041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.release();
1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new value-initialized expression.
10101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds the implicit value initialization without performing
1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// any semantic analysis. Subclasses may override this routine to provide
1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new \c va_arg expression.
10191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    QualType T, SourceLocation RParenLoc) {
10241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                RParenLoc);
1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new expression list in parentheses.
10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        MultiExprArg SubExprs,
1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new address-of-label expression.
10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// By default, performs semantic analysis, using the name of the label
1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// rather than attempting to map the label statement itself.
1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LabelLoc,
1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        LabelStmt *Label) {
1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new GNU statement expression.
10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ///
1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   StmtArg SubStmt,
1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   SourceLocation RParenLoc) {
1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_types_compatible_p expression.
1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              QualType T1, QualType T2,
1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation RParenLoc) {
1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T1.getAsOpaquePtr(),
1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              T2.getAsOpaquePtr(),
1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              RParenLoc);
1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new __builtin_choose_expr expression.
1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg Cond, ExprArg LHS, ExprArg RHS,
1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation RParenLoc) {
1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ActOnChooseExpr(BuiltinLoc,
1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   move(Cond), move(LHS), move(RHS),
1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   RParenLoc);
1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new overloaded operator call expression.
1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// The semantic analysis provides the behavior of template instantiation,
1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// copying with transformations that turn what looks like an overloaded
10891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// operator call into a use of a builtin operator, performing
1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// argument-dependent lookup, etc. Subclasses may override this routine to
1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              SourceLocation OpLoc,
1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Callee,
1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg First,
1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExprArg Second);
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new C++ "named" cast expression, such as static_cast or
1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// reinterpret_cast.
1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, this routine dispatches to one of the more-specific routines
11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           Stmt::StmtClass Class,
1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    switch (Class) {
1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXStaticCastExprClass:
11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
11151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXDynamicCastExprClass:
11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    RAngleLoc, LParenLoc,
1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move(SubExpr), RParenLoc);
11221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXReinterpretCastExprClass:
11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        RAngleLoc, LParenLoc,
11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                        move(SubExpr),
1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        RParenLoc);
11281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::CXXConstCastExprClass:
11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
11311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   RAngleLoc, LParenLoc,
1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr), RParenLoc);
11331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    default:
1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      assert(false && "Invalid C++ named cast");
1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      break;
1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ExprError();
1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ static_cast expression.
1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LAngleLoc,
1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            QualType T,
1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RAngleLoc,
1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation LParenLoc,
1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            ExprArg SubExpr,
1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ dynamic_cast expression.
1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LAngleLoc,
1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             QualType T,
1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RAngleLoc,
1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation LParenLoc,
1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ExprArg SubExpr,
1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             SourceLocation RParenLoc) {
1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
11701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ reinterpret_cast expression.
1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LAngleLoc,
1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RAngleLoc,
1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SubExpr,
1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ const_cast expression.
1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LAngleLoc,
1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           QualType T,
1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RAngleLoc,
1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           ExprArg SubExpr,
1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
12021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       LParenLoc, move(SubExpr), RParenLoc);
1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ functional-style cast expression.
1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                QualType T,
1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation LParenLoc,
1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                ExprArg SubExpr,
1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation RParenLoc) {
121588650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner    void *Sub = SubExpr.takeAs<Expr>();
1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
121988650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner                                         Sema::MultiExprArg(getSema(), &Sub, 1),
12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               /*CommaLocs=*/0,
1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(type) expression.
1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        QualType T,
1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
12321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    T.getAsOpaquePtr(), RParenLoc);
1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ typeid(expr) expression.
1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation LParenLoc,
1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand,
1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        SourceLocation RParenLoc) {
12441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Result
1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 RParenLoc);
1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().ExprError();
12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return move(Result);
12521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
12531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "this" expression.
1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new "this" expression without performing any
12571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// semantic analysis. Subclasses may override this routine to provide
1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// different behavior.
12591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      QualType ThisType) {
1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().Owned(
1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                      new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ throw expression.
1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ default-argument expression.
1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, builds a new default-argument expression, which does not
1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// require any semantic analysis. Subclasses may override this routine to
1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// provide different behavior.
1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
1279f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson    return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ zero-initialization expression.
1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation LParenLoc,
1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               QualType T,
1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation RParenLoc) {
12901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
12911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               T.getAsOpaquePtr(), LParenLoc,
12921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               MultiExprArg(getSema(), 0, 0),
1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               0, RParenLoc);
1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ conditional declaration expression.
1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation EqLoc,
1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               VarDecl *Var) {
1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    EqLoc,
1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                                    Var));
1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "new" expression.
1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     bool UseGlobal,
1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementLParen,
1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg PlacementArgs,
1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation PlacementRParen,
13171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     bool ParenTypeId,
1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     QualType AllocType,
1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation TypeLoc,
1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceRange TypeRange,
1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     ExprArg ArraySize,
1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorLParen,
1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     MultiExprArg ConstructorArgs,
1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                     SourceLocation ConstructorRParen) {
13251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().BuildCXXNew(StartLoc, UseGlobal,
1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementLParen,
1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(PlacementArgs),
1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 PlacementRParen,
1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ParenTypeId,
1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 AllocType,
1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeLoc,
1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 TypeRange,
1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ArraySize),
1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorLParen,
1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 move(ConstructorArgs),
1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                 ConstructorRParen);
1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new C++ "delete" expression.
1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsGlobalDelete,
1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        bool IsArrayForm,
1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        ExprArg Operand) {
1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    move(Operand));
1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new unary type trait expression.
1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation StartLoc,
1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LParenLoc,
1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
13601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         T.getAsOpaquePtr(), RParenLoc);
1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new qualified declaration reference expression.
1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS,
1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceRange QualifierRange,
1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               NamedDecl *ND,
1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               SourceLocation Location,
1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               bool IsAddressOfOperand) {
1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
13761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Location,
1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ND->getDeclName(),
1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*Trailing lparen=*/false,
1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              &SS,
1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              IsAddressOfOperand);
1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
13841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  /// \brief Build a new (previously unresolved) declaration reference
1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// expression.
1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceRange QualifierRange,
1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                DeclarationName Name,
1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                SourceLocation Location,
1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                bool IsAddressOfOperand) {
1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setRange(QualifierRange);
1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SS.setScopeRep(NNS);
13971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Location,
1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Name,
1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*Trailing lparen=*/false,
1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              &SS,
1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              IsAddressOfOperand);
1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new template-id expression.
1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildTemplateIdExpr(TemplateName Template,
1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation TemplateLoc,
1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation LAngleLoc,
1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgument *TemplateArgs,
1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         unsigned NumTemplateArgs,
1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RAngleLoc) {
1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().BuildTemplateIdExpr(Template, TemplateLoc,
1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         LAngleLoc,
1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         TemplateArgs, NumTemplateArgs,
1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         RAngleLoc);
1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXConstructExpr(QualType T,
1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           CXXConstructorDecl *Constructor,
1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           bool IsElidable,
1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           MultiExprArg Args) {
1429ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson    return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1430ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           SourceLocation(),
1431ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson                                           T, Constructor, IsElidable,
1432f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson                                           move(Args));
1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 QualType T,
1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation LParenLoc,
1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 MultiExprArg Args,
1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation *Commas,
1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 SourceLocation RParenLoc) {
1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new object-construction expression.
1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     QualType T,
1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation LParenLoc,
1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     MultiExprArg Args,
1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation *Commas,
1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     SourceLocation RParenLoc) {
1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           /*FIXME*/LParenLoc),
1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               T.getAsOpaquePtr(),
1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               LParenLoc,
1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move(Args),
1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               Commas,
1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               RParenLoc);
1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
14711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new member reference expression.
1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
14760dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  bool IsArrow,
1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  SourceLocation OperatorLoc,
1479a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              NestedNameSpecifier *Qualifier,
1480a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                  SourceRange QualifierRange,
1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  DeclarationName Name,
1482c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                  SourceLocation MemberLoc,
1483c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
14840dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor    OwningExprResult Base = move(BaseE);
1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
1486a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor
1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CXXScopeSpec SS;
1488a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setRange(QualifierRange);
1489a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    SS.setScopeRep(Qualifier);
14901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(Base), OperatorLoc, OpKind,
1493017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            MemberLoc,
1494017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor                                            Name,
1495a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                    /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
1496c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            &SS,
1497c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                            FirstQualifierInScope);
1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
15003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// \brief Build a new member reference expression with explicit template
15013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// arguments.
15023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  ///
15033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
15043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
15053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
15063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  bool IsArrow,
15073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation OperatorLoc,
15083b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                NestedNameSpecifier *Qualifier,
15093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceRange QualifierRange,
15103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  TemplateName Template,
15113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                SourceLocation TemplateNameLoc,
15123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NamedDecl *FirstQualifierInScope,
15133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation LAngleLoc,
15143b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                          const TemplateArgument *TemplateArgs,
15153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  unsigned NumTemplateArgs,
15163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                  SourceLocation RAngleLoc) {
15173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OwningExprResult Base = move(BaseE);
15183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
15191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    CXXScopeSpec SS;
15213b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setRange(QualifierRange);
15223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    SS.setScopeRep(Qualifier);
15231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // FIXME: We're going to end up looking up the template based on its name,
15253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr.
15263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    DeclarationName Name;
15273b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
15283b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = ActualTemplate->getDeclName();
15291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else if (OverloadedFunctionDecl *Ovl
15303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor               = Template.getAsOverloadedFunctionDecl())
15313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Ovl->getDeclName();
15323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    else
15333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      Name = Template.getAsDependentTemplateName()->getName();
15341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
15363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              OperatorLoc, OpKind,
15373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              TemplateNameLoc, Name, true,
15383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              LAngleLoc, TemplateArgs,
15393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              NumTemplateArgs, RAngleLoc,
15403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              Sema::DeclPtrTy(), &SS);
15413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C @encode expression.
1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         QualType T,
1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         SourceLocation RParenLoc) {
1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           RParenLoc));
15521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new Objective-C protocol expression.
1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation AtLoc,
1560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation ProtoLoc,
1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation LParenLoc,
1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           SourceLocation RParenLoc) {
1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              Protocol->getIdentifier(),
1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             AtLoc,
1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             ProtoLoc,
1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                             LParenLoc,
15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                             RParenLoc));
1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
15701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// \brief Build a new shuffle vector expression.
1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ///
1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// By default, performs semantic analysis to build the new expression.
1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  /// Subclasses may override this routine to provide different behavior.
1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            MultiExprArg SubExprs,
1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            SourceLocation RParenLoc) {
1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Find the declaration for __builtin_shufflevector
15791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const IdentifierInfo &Name
1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.Context.Idents.get("__builtin_shufflevector");
1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
15841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Build a reference to the __builtin_shufflevector builtin
1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Expr *Callee
1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                          BuiltinLoc, false, false);
1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SemaRef.UsualUnaryConversions(Callee);
15911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Build the CallExpr
1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    unsigned NumSubExprs = SubExprs.size();
1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr **Subs = (Expr **)SubExprs.release();
1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Subs, NumSubExprs,
1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       Builtin->getResultType(),
1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       RParenLoc);
1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
16001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // Type-check the __builtin_shufflevector expression.
1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Result.isInvalid())
1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwnedCall.release();
16071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return move(Result);
1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
1609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor};
1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
161143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
161243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
161343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!S)
161443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.Owned(S);
16151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
161643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  switch (S->getStmtClass()) {
161743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::NoStmtClass: break;
16181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
161943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform individual statement nodes
162043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)                                              \
162143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
162243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent)
162343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
162543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform expressions by calling TransformExpr.
162643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent)
162743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class:
162843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def"
162943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    {
163043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
163143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (E.isInvalid())
163243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        return getSema().StmtError();
16331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
163443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().Owned(E.takeAs<Stmt>());
163543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
16361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
163843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
163943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1642670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived>
1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    bool isAddressOfOperand) {
1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!E)
1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E);
1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  switch (E->getStmtClass()) {
1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::NoStmtClass: break;
1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break;
1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent)                                              \
1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def"
16541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
16551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(E->Retain());
1657657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor}
1658657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor
1659657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived>
1660dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
1661dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
1662a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     SourceRange Range,
1663c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     QualType ObjectType,
1664c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
16650979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor  if (!NNS)
16660979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor    return 0;
16671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the prefix of this nested name specifier.
1669dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  NestedNameSpecifier *Prefix = NNS->getPrefix();
1670dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (Prefix) {
16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
1672c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       ObjectType,
1673c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                       FirstQualifierInScope);
1674dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!Prefix)
1675dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return 0;
16761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // Clear out the object type and the first qualifier in scope; they only
1678c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    // apply to the first element in the nested-name-specifier.
1679a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    ObjectType = QualType();
1680c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    FirstQualifierInScope = 0;
1681dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1683dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  switch (NNS->getKind()) {
1684dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Identifier:
16851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((Prefix || !ObjectType.isNull()) &&
1686a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor            "Identifier nested-name-specifier with no prefix or object type");
1687a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1688a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor        ObjectType.isNull())
1689dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1692a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   *NNS->getAsIdentifier(),
1693c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   ObjectType,
1694c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   FirstQualifierInScope);
16951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1696dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Namespace: {
16971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NamespaceDecl *NS
1698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      = cast_or_null<NamespaceDecl>(
1699dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                            getDerived().TransformDecl(NNS->getAsNamespace()));
17001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!getDerived().AlwaysRebuild() &&
1701dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1702dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        NS == NNS->getAsNamespace())
1703dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::Global:
1709dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // There is no meaningful transformation that one could perform on the
1710dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    // global scope.
1711dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NNS;
17121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1713dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
1714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
1716d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (T.isNull())
1717d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return 0;
17181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        Prefix == NNS->getPrefix() &&
1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor        T == QualType(NNS->getAsType(), 0))
1722dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      return NNS;
17231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
17251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
1726dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   T);
1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
17291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // Required to silence a GCC warning
17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return 0;
1732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
1734dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
17351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName
173681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
173781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                                 SourceLocation Loc) {
173881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
173981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
174081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
174181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  switch (Name.getNameKind()) {
174281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::Identifier:
174381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
174481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
174581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
174681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXOperatorName:
174781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXUsingDirective:
174881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return Name;
17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
175081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConstructorName:
175181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXDestructorName:
175281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  case DeclarationName::CXXConversionFunctionName: {
175381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    TemporaryBase Rebase(*this, Loc, Name);
175481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    QualType T = getDerived().TransformType(Name.getCXXNameType());
175581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    if (T.isNull())
175681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor      return DeclarationName();
17571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
175881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.Context.DeclarationNames.getCXXSpecialName(
17591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                           Name.getNameKind(),
176081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor                                          SemaRef.Context.getCanonicalType(T));
176181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  }
17621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
176481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  return DeclarationName();
176581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor}
176681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor
176781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived>
17681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
17693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name,
17703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              QualType ObjectType) {
1771d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
17721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1773d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1774d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                      /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1775d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!NNS)
1776d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
17771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1778d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (TemplateDecl *Template = QTN->getTemplateDecl()) {
17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      TemplateDecl *TransTemplate
1780d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1781d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!TransTemplate)
1782d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return TemplateName();
17831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1784d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      if (!getDerived().AlwaysRebuild() &&
1785d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          NNS == QTN->getQualifier() &&
1786d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor          TransTemplate == Template)
1787d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        return Name;
17881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1789d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1790d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                              TransTemplate);
1791d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    }
17921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1793d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1794d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    assert(Ovl && "Not a template name or an overload set?");
17951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OverloadedFunctionDecl *TransOvl
1796d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1797d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransOvl)
1798d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
17991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1800d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1801d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        NNS == QTN->getQualifier() &&
1802d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransOvl == Ovl)
1803d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1805d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1806d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TransOvl);
1807d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1809d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NestedNameSpecifier *NNS
1811d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1812d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                        /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
18133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!NNS && DTN->getQualifier())
1814d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1816d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1817d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        NNS == DTN->getQualifier())
1818d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
18203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType);
1821d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateDecl *TransTemplate
1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1826d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!TransTemplate)
1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return TemplateName();
18281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor        TransTemplate == Template)
1831d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      return Name;
18321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName(TransTemplate);
1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  }
18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1837d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  assert(Ovl && "Not a template name or an overload set?");
18381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OverloadedFunctionDecl *TransOvl
1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!TransOvl)
1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return TemplateName();
18421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor      TransOvl == Ovl)
1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor    return Name;
18461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return TemplateName(TransOvl);
1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
1850d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
18511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument
1852670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) {
1853670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  switch (Arg.getKind()) {
1854670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Null:
1855670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Integral:
1856670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return Arg;
18571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1858670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Type: {
1859670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    QualType T = getDerived().TransformType(Arg.getAsType());
1860670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (T.isNull())
1861670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1862670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(Arg.getLocation(), T);
1863670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
18641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1865670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Declaration: {
1866670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1867670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (!D)
1868670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1869670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(Arg.getLocation(), D);
1870670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
18711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1872670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Expression: {
1873670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    // Template argument expressions are not potentially evaluated.
18741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EnterExpressionEvaluationContext Unevaluated(getSema(),
1875670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                                 Action::Unevaluated);
18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1877670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr());
1878670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    if (E.isInvalid())
1879670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      return TemplateArgument();
1880670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return TemplateArgument(E.takeAs<Expr>());
1881670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
18821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1883670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  case TemplateArgument::Pack: {
1884670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1885670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TransformedArgs.reserve(Arg.pack_size());
18861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
1887670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                                      AEnd = Arg.pack_end();
1888670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor         A != AEnd; ++A) {
1889670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      TemplateArgument TA = getDerived().TransformTemplateArgument(*A);
1890670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      if (TA.isNull())
1891670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor        return TA;
18921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1893670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor      TransformedArgs.push_back(TA);
1894670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    }
1895670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    TemplateArgument Result;
18961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
1897670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor                           true);
1898670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor    return Result;
1899670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
1900670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  }
19011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1902670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Work around bogus GCC warning
1903670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  return TemplateArgument();
1904670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor}
1905670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
1906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
1907577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation
1908577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
1909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1910577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
1911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) {
1912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (getDerived().AlreadyTransformed(T))
1913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return T;
19141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19150953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  QualifierCollector Qs;
19160953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  const Type *Ty = Qs.strip(T);
19170953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
1918577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Result;
19190953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  switch (Ty->getTypeClass()) {
19201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define ABSTRACT_TYPE(CLASS, PARENT)
1921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT)                                                  \
1922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    case Type::CLASS:                                                        \
1923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Result = getDerived().Transform##CLASS##Type(                          \
19240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                       static_cast<const CLASS##Type*>(Ty)); \
1925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
19261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "clang/AST/TypeNodes.def"
1927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
19281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1929577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Result.isNull() || T == Result)
1930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return Result;
19311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return getDerived().AddTypeQualifiers(Result, Qs);
1933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
19361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
19370953e767ff7817f97b3ab20896b229891eeff45bJohn McCallTreeTransform<Derived>::AddTypeQualifiers(QualType T, Qualifiers Quals) {
19380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  if (!Quals.empty() && !T->isFunctionType() && !T->isReferenceType())
19390953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    return SemaRef.Context.getQualifiedType(T, Quals);
19401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return T;
1942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19431bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis
19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
19451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) {
1946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // Nothing to do
19471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
1948577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
1951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFixedWidthIntType(
19521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  const FixedWidthIntType *T) {
1953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
19541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
1955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
19581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) {
1959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
19601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
1961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
1964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) {
1965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
19681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
1971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
1972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
1973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildPointerType(PointeeType);
1974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
19751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
19761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
19771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
19781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) {
1979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1980577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
1985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
19861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildBlockPointerType(PointeeType);
1988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
1989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
19901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
19911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
1992577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformLValueReferenceType(
19931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                               const LValueReferenceType *T) {
1994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
1996577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
19971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
1999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
2000577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
20011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2002577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildLValueReferenceType(PointeeType);
2003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
20051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
20061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
2007577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformRValueReferenceType(
20081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              const RValueReferenceType *T) {
2009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType())
2015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
20161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildRValueReferenceType(PointeeType);
2018577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
20211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
20221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) {
2023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (PointeeType.isNull())
2025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0));
2028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ClassType.isNull())
2029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      PointeeType == T->getPointeeType() &&
2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ClassType == QualType(T->getClass(), 0))
2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildMemberPointerType(PointeeType, ClassType);
2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
20401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
20411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) {
2042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConstantArrayType(ElementType,
2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSizeModifier(),
2052577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSize(),
20530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                               T->getIndexTypeCVRQualifiers());
2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType(
20581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              const IncompleteArrayType *T) {
2059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildIncompleteArrayType(ElementType,
2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 T->getSizeModifier(),
20690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                               T->getIndexTypeCVRQualifiers());
2070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVariableArrayType(
20741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  const VariableArrayType *T) {
2075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2079670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2080670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2081670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
20851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
2088577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
2089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
2090577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2091577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
20921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildVariableArrayType(ElementType,
2094577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getSizeModifier(),
2095577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               move(Size),
20960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                               T->getIndexTypeCVRQualifiers(),
2097577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getBracketsRange());
2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedArrayType(
21021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const DependentSizedArrayType *T) {
2103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2107670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Array bounds are not potentially evaluated contexts
2108670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
21091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
2116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
2117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
2118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
21201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDependentSizedArrayType(ElementType,
2122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     T->getSizeModifier(),
2123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     move(Size),
21240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall                                            T->getIndexTypeCVRQualifiers(),
2125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                     T->getBracketsRange());
2126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
21271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
21301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                      const DependentSizedExtVectorType *T) {
2131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2135670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // Vector sizes are not potentially evaluated contexts
2136670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2137670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor
2138577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2139577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Size.isInvalid())
2140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2142577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType() &&
2144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Size.get() == T->getSizeExpr()) {
2145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    Size.take();
2146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
21481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDependentSizedExtVectorType(ElementType,
2150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         move(Size),
2151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                         T->getAttributeLoc());
2152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
21531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) {
2156577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2157577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2158577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
21631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildVectorType(ElementType, T->getNumElements());
2165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
21661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
21681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
21691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) {
2170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ElementType = getDerived().TransformType(T->getElementType());
2171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ElementType.isNull())
2172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ElementType == T->getElementType())
2176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(),
2179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           /*FIXME*/SourceLocation());
2180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
21821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionProtoType(
21841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  const FunctionProtoType *T) {
2185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType ResultType = getDerived().TransformType(T->getResultType());
2186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (ResultType.isNull())
2187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
21881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<QualType, 4> ParamTypes;
2190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                         ParamEnd = T->arg_type_end();
2192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor       Param != ParamEnd; ++Param) {
2193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    QualType P = getDerived().TransformType(*Param);
2194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (P.isNull())
2195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
21961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    ParamTypes.push_back(P);
2198577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
21991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2200577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      ResultType == T->getResultType() &&
2202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin()))
2203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
22041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(),
2206577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               ParamTypes.size(), T->isVariadic(),
2207577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                               T->getTypeQuals());
2208577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType(
22121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                const FunctionNoProtoType *T) {
2213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
22141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
2215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
22181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) {
2219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  TypedefDecl *Typedef
2220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Typedef)
2222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Typedef == T->getDecl())
2226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
22271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypedefType(Typedef);
2229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfExprType(
22331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    const TypeOfExprType *T) {
2234670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // typeof expressions are not potentially evaluated contexts
2235670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
22361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
2240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      E.get() == T->getUnderlyingExpr()) {
2243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    E.take();
2244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
22461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypeOfExprType(move(E));
2248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) {
2252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Underlying.isNull())
2254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Underlying == T->getUnderlyingType())
2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
22591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypeOfType(Underlying);
2261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) {
2265670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  // decltype expressions are not potentially evaluated contexts
2266670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
22671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (E.isInvalid())
2270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      E.get() == T->getUnderlyingExpr()) {
2274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    E.take();
2275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
22771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildDecltypeType(move(E));
2279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
22821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) {
2283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  RecordDecl *Record
2284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Record)
2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
22871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Record == T->getDecl())
2290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
22911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildRecordType(Record);
2293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
22941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
22961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) {
2297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  EnumDecl *Enum
2298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!Enum)
2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Enum == T->getDecl())
2304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
23051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildEnumType(Enum);
2307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23087da2431c23ef1ee8acb114e39692246e1801afc2John McCall
23097da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived>
23107da2431c23ef1ee8acb114e39692246e1801afc2John McCallQualType TreeTransform<Derived>::TransformElaboratedType(
23117da2431c23ef1ee8acb114e39692246e1801afc2John McCall                                                    const ElaboratedType *T) {
23127da2431c23ef1ee8acb114e39692246e1801afc2John McCall  QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
23137da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (Underlying.isNull())
23147da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType();
23151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23167da2431c23ef1ee8acb114e39692246e1801afc2John McCall  if (!getDerived().AlwaysRebuild() &&
23177da2431c23ef1ee8acb114e39692246e1801afc2John McCall      Underlying == T->getUnderlyingType())
23187da2431c23ef1ee8acb114e39692246e1801afc2John McCall    return QualType(T, 0);
23191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23207da2431c23ef1ee8acb114e39692246e1801afc2John McCall  return getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
23217da2431c23ef1ee8acb114e39692246e1801afc2John McCall}
23221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType(
23261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              const TemplateTypeParmType *T) {
2327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // Nothing to do
23281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
23311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
233249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
233349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                                         const SubstTemplateTypeParmType *T) {
233449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  // Nothing to do
233549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  return QualType(T, 0);
233649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall}
233749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
233849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived>
2339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType(
23401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        const TemplateSpecializationType *T) {
23411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformTemplateName(T->getTemplateName());
2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Template.isNull())
2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs;
2347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NewTemplateArgs.reserve(T->getNumArgs());
2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor       Arg != ArgEnd; ++Arg) {
2350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg);
2351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewArg.isNull())
2352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
23531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    NewTemplateArgs.push_back(NewArg);
2355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
23561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: early abort if all of the template arguments and such are the
2358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // same.
23591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: We're missing the locations of the template name, '<', and '>'.
2361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTemplateSpecializationType(Template,
2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        NewTemplateArgs.data(),
2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        NewTemplateArgs.size());
2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformQualifiedNameType(
2368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  const QualifiedNameType *T) {
2369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                SourceRange());
2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType Named = getDerived().TransformType(T->getNamedType());
2376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (Named.isNull())
2377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
2380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      NNS == T->getQualifier() &&
2381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      Named == T->getNamedType())
2382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType(T, 0);
2383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildQualifiedNameType(NNS, Named);
2385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
23861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) {
2389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  NestedNameSpecifier *NNS
2390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
23914a959d8788179d654df6b213b08d2b064989211dDouglas Gregor                        SourceRange(/*FIXME:*/getDerived().getBaseLocation()));
2392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (!NNS)
2393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return QualType();
23941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    QualType NewTemplateId
2397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      = getDerived().TransformType(QualType(TemplateId, 0));
2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (NewTemplateId.isNull())
2399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType();
24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (!getDerived().AlwaysRebuild() &&
2402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NNS == T->getQualifier() &&
2403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor        NewTemplateId == QualType(TemplateId, 0))
2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      return QualType(T, 0);
24051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return getDerived().RebuildTypenameType(NNS, NewTemplateId);
2407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  }
2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
2409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return getDerived().RebuildTypenameType(NNS, T->getIdentifier());
2410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
2413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCInterfaceType(
24141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  const ObjCInterfaceType *T) {
2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
24161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
2417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
24181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
2420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCObjectPointerType(
24211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             const ObjCObjectPointerType *T) {
2422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Implement
24231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return QualType(T, 0);
2424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
2425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
242624fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidistemplate<typename Derived>
242724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios KyrtzidisQualType TreeTransform<Derived>::TransformObjCProtocolListType(
242824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis                                                const ObjCProtocolListType *T) {
242924fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis  assert(false && "Should not see ObjCProtocolList types");
243024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis  return QualType(T, 0);
243124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis}
243224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis
2433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
243443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation
243543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
243643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
243743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
24381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
24391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
244043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
244143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
244243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
244343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
244443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
244543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().TransformCompoundStmt(S, false);
244643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
244743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
244843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
244943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
24501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
245143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              bool IsStmtExpr) {
245243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool SubStmtChanged = false;
245343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
245443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
245543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       B != BEnd; ++B) {
245643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    OwningStmtResult Result = getDerived().TransformStmt(*B);
245743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Result.isInvalid())
245843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return getSema().StmtError();
24591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
246043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    SubStmtChanged = SubStmtChanged || Result.get() != *B;
246143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Statements.push_back(Result.takeAs<Stmt>());
246243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
24631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
246443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
246543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !SubStmtChanged)
24661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
246743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
246843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
246943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move_arg(Statements),
247043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          S->getRBracLoc(),
247143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          IsStmtExpr);
247243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
24731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
247443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
247543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
24761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
247743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // The case value expressions are not potentially evaluated.
247843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
24791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
248043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the left-hand case value.
248143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
248243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (LHS.isInvalid())
248343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
24841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
248543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the right-hand case value (for the GNU case-range extension).
248643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
248743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (RHS.isInvalid())
248843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
24891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
249043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Build the case statement.
249143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Case statements are always rebuilt so that they will attached to their
249243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transformed switch statement.
249343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
249443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(LHS),
249543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getEllipsisLoc(),
249643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       move(RHS),
249743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                                       S->getColonLoc());
249843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Case.isInvalid())
249943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
250143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the case
250243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
250343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
250443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
250643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Attach the body to the case statement
250743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
250843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
250943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
251043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
251143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
25121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
251343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the statement following the default case
251443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
251543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
251643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
251843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Default statements are always rebuilt
251943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
252043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                         move(SubStmt));
252143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
25221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
252343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
252443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
25251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
252643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
252743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (SubStmt.isInvalid())
252843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
253043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Pass the real colon location in.
253143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
253243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
253343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                       move(SubStmt));
253443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
25351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
253643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
25371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
25381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
253943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
254043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
254143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
254243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
254443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
25451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
254643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "then" branch.
254743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
254843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Then.isInvalid())
254943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
255143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the "else" branch.
255243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
255343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Else.isInvalid())
255443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
255643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
255743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
255843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Then.get() == S->getThen() &&
255943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Else.get() == S->getElse())
25601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
25611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
256243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
25631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    S->getElseLoc(), move(Else));
256443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
256543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
256643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
256743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
25681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
256943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition.
257043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
257143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
257243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
257443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Rebuild the switch statement.
257543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
257643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Switch.isInvalid())
257743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
257943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body of the switch statement.
258043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
258143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
258243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
258443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Complete the switch statement.
258543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
258643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            move(Body));
258743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
25881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
258943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
259043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
25911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
259243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
259343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
259443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
259543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
25961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
25981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
260043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
260143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
260243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
26031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
260443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
260543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      FullCond->get() == S->getCond() &&
260643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
26071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
26081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
260943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
261043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
26111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
261243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
261343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
261443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
261543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
261643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
261743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
261843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
26191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
262043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
262143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
262243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
262343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
26241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
262543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
262643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
262743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
26291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
263043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
263143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    /*FIXME:*/S->getWhileLoc(), move(Cond),
263243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    S->getRParenLoc());
263343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
26341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
263543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
263643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
26371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) {
263843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the initialization statement
263943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
264043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Init.isInvalid())
264143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
26421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
264343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the condition
264443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
264543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Cond.isInvalid())
264643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
26471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
264843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the increment
264943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
265043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Inc.isInvalid())
265143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
26521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
265343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the body
265443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
265543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Body.isInvalid())
265643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
26571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
265843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
265943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Init.get() == S->getInit() &&
266043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Cond.get() == S->getCond() &&
266143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Inc.get() == S->getInc() &&
266243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Body.get() == S->getBody())
26631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
26641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
266543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
266643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     move(Init), move(Cond), move(Inc),
266743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                     S->getRParenLoc(), move(Body));
266843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
266943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
267043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
26711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult
26721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
267343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Goto statements must always be rebuilt, to resolve the label.
26741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
267543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getLabel());
267643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
267743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
267843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
267943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
26801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
268143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
268243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Target.isInvalid())
268343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
26841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
268543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
268643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Target.get() == S->getTarget())
26871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
268843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
268943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
269043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                              move(Target));
269143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
269243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
269343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
269443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
26951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
26961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
269743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
26981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
269943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
270043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
27011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
270343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
27041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
270543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
270643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
27071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
270843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
270943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Result.isInvalid())
271043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
271143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: We always rebuild the return statement because there is no way
271343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // to tell whether the return type of the function has changed.
271443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
271543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
27161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
271743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
271843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
27191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
272043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool DeclChanged = false;
272143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  llvm::SmallVector<Decl *, 4> Decls;
272243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
272343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor       D != DEnd; ++D) {
272443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decl *Transformed = getDerived().TransformDefinition(*D);
272543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Transformed)
272643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
27271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
272843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Transformed != *D)
272943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      DeclChanged = true;
27301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
273143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Decls.push_back(Transformed);
273243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
273443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() && !DeclChanged)
27351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
27361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
273843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                      S->getStartLoc(), S->getEndLoc());
273943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
27401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
274143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
274243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
27431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
274443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "SwitchCase is abstract and cannot be transformed");
27451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
274643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
274743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
274843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
274943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
275043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
275143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement!
275243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Inline assembly cannot be transformed");
27531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
275443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
275543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
275643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
275743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
275843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
27591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
276043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
276143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @try statement");
27621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
276343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
27641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
276543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
276643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
27671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
276843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
276943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @catch statement");
277043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return SemaRef.Owned(S->Retain());
277143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
27721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
277343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
277443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
27751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
277643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
277743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @finally statement");
27781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
277943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
27801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
278143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
278243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
27831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
278443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
278543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @throw statement");
27861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
278743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
27881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
278943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
279043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
279143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
27921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCAtSynchronizedStmt *S) {
279343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
279443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C @synchronized statement");
27951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
279643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
279743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
279843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
279943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
280043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt(
28011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  ObjCForCollectionStmt *S) {
280243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // FIXME: Implement this
280343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  assert(false && "Cannot transform an Objective-C for-each statement");
28041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(S->Retain());
280543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
280643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
280743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
280843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
280943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
281043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
281143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the exception declaration, if any.
281243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  VarDecl *Var = 0;
281343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (S->getExceptionDecl()) {
281443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    VarDecl *ExceptionDecl = S->getExceptionDecl();
281543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
281643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                         ExceptionDecl->getDeclName());
281743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
281843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    QualType T = getDerived().TransformType(ExceptionDecl->getType());
281943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (T.isNull())
282043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
28211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
282243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
282343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            T,
282443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getDeclaratorInfo(),
282543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getIdentifier(),
282643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            ExceptionDecl->getLocation(),
282743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                            /*FIXME: Inaccurate*/
282843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                    SourceRange(ExceptionDecl->getLocation()));
282943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (!Var || Var->isInvalidDecl()) {
283043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      if (Var)
283143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor        Var->Destroy(SemaRef.Context);
283243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
283343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    }
283443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
28351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
283643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the actual exception handler.
283743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
283843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (Handler.isInvalid()) {
283943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Var)
284043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Var->Destroy(SemaRef.Context);
284143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
284243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
28431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
284443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
284543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !Var &&
284643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      Handler.get() == S->getHandlerBlock())
28471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
284843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
284943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
285043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          Var,
285143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor                                          move(Handler));
285243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
28531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
285443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived>
285543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult
285643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
285743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the try block itself.
28581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult TryBlock
285943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = getDerived().TransformCompoundStmt(S->getTryBlock());
286043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (TryBlock.isInvalid())
286143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    return SemaRef.StmtError();
28621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
286343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // Transform the handlers.
286443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  bool HandlerChanged = false;
286543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
286643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningStmtResult Handler
286843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      = getDerived().TransformCXXCatchStmt(S->getHandler(I));
286943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    if (Handler.isInvalid())
287043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      return SemaRef.StmtError();
28711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
287243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
287343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    Handlers.push_back(Handler.takeAs<Stmt>());
287443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  }
28751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
287643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  if (!getDerived().AlwaysRebuild() &&
287743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      TryBlock.get() == S->getTryBlock() &&
287843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor      !HandlerChanged)
28791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(S->Retain());
288043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor
288143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
28821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        move_arg(Handlers));
288343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor}
28841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
288543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===//
2886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation
2887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===//
28881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
28891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
28901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
28911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
28921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
28931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
28941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
28951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
28961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
28971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *ND
2898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
2899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
2900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
29011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && ND == E->getDecl())
29031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
29041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDeclRefExpr(ND, E->getLocation());
2906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
29091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
29101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
29111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
2912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
29131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
29151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
29161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
29171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
2918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
29191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
29211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
29221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
29231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
2924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
29251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
29271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
29281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
29291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
2930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
29311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
29331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
29341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
29351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
2936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
29371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
29391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
29401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
2941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
29441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
29461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
2949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       E->getRParen());
2950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
2951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
29521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
29531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
29541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
2955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
2957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
29581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
29601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
29611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
2963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getOpcode(),
2964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr));
2965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
29661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
29681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
29691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
2970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isArgumentType()) {
2971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getArgumentType());
2972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
2973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
29741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
2976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
29771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
29781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
29791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             E->isSizeOf(),
2980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getSourceRange());
2981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
29821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::OwningExprResult SubExpr(SemaRef);
29841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {
2985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // C++0x [expr.sizeof]p1:
2986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   The operand is either an expression, which is an unevaluated operand
2987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    //   [...]
2988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
29891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
2991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
2992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
29931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
2995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
2996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
2999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isSizeOf(),
3000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getSourceRange());
3001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
30021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
30041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
30131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
30191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildArraySubscriptExpr(move(LHS),
3021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLHS()->getLocStart(),
3022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                move(RHS),
3023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getRBracketLoc());
3024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
30251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
30271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the callee.
3030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform arguments.
3035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgChanged = false;
3036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
30421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Wrong source location information for the ','.
3044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
3045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
30461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
3048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(Arg.takeAs<Expr>());
3049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
30501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgChanged)
3054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
30551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Wrong source location information for the '('.
30571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLParenLoc
3058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = ((Expr *)Callee.get())->getSourceRange().getBegin();
3059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move_arg(Args),
3061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      FakeCommaLocs.data(),
3062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
30641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
30661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
30671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
3068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
30711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
307283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  NestedNameSpecifier *Qualifier = 0;
307383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (E->hasQualifier()) {
30741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Qualifier
307583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
307683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                                  E->getQualifierRange());
3077c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    if (Qualifier == 0)
307883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      return SemaRef.ExprError();
307983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  }
30801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *Member
3082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Member)
3084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
30851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase() &&
308883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor      Qualifier == E->getQualifier() &&
3089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Member == E->getMemberDecl())
30901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus source location for the operator
3093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeOperatorLoc
3094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isArrow(),
309883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        Qualifier,
309983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                                        E->getQualifierRange(),
3100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getMemberLoc(),
31011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        Member);
3102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
31051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
31061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
31081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
31101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
31131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
3114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
31171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
31211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
31251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
31261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(LHS), move(RHS));
3129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
31311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator(
3134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  CompoundAssignOperator *E) {
3135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformBinaryOperator(E);
3136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
31371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
31391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
31401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
3141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
31441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
31481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
31521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
3157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
31581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildConditionalOperator(move(Cond),
316047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getQuestionLoc(),
31611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(LHS),
316247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor                                                 E->getColonLoc(),
3163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(RHS));
3164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
31661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
31671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
31681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
3169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
31721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
31761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
31801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
31811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              move(SubExpr),
3184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->isLvalueCast());
3185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
31861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
31881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
31891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform abstract class");
31911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
31961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
3197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
32031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getTypeAsWritten());
3205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
32081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
32121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
3215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
32161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
32171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc(),
3220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            move(SubExpr));
3221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
32221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
32241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
3227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
32291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation FakeTypeLoc
3230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
32321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
32371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
32411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInitializer())
32451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                   /*FIXME:*/E->getInitializer()->getLocEnd(),
3249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Init));
3250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
32511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
32541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
3255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
3257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
32581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Base.get() == E->getBase())
32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
32621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad source location
32641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeOperatorLoc
3265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessorLoc(),
3268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getAccessor());
3269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
32701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
32721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
32731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
3274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool InitChanged = false;
32751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
32811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    InitChanged = InitChanged || Init.get() != E->getInit(I);
3283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
32851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() && !InitChanged)
32871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRBraceLoc());
3291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
32921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
32951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
3296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Designation Desig;
32971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the initializer value
3299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Init.isInvalid())
3301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
33021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the designators.
3304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ExprChanged = false;
3306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             DEnd = E->designators_end();
3308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       D != DEnd; ++D) {
3309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isFieldDesignator()) {
3310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Desig.AddDesignator(Designator::getField(D->getFieldName(),
3311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getDotLoc(),
3312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getFieldLoc()));
3313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
33151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (D->isArrayDesignator()) {
3317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Index.isInvalid())
3319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
33201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Desig.AddDesignator(Designator::getArray(Index.get(),
3322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               D->getLBracketLoc()));
33231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArrayExprs.push_back(Index.release());
3326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      continue;
3327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
33281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    assert(D->isArrayRangeDesignator() && "New kind of designator?");
33301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    OwningExprResult Start
3331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Start.isInvalid())
3333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
33341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (End.isInvalid())
3337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
33381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
33391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Desig.AddDesignator(Designator::getArrayRange(Start.get(),
3340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  End.get(),
3341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getLBracketLoc(),
3342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  D->getEllipsisLoc()));
33431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      End.get() != E->getArrayRangeEnd(*D);
33461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(Start.release());
3348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArrayExprs.push_back(End.release());
3349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
33501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Init.get() == E->getInit() &&
3353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ExprChanged)
3354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
33551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getEqualOrColonLoc(),
3358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->usesGNUSyntax(), move(Init));
3359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr(
33641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    ImplicitValueInitExpr *E) {
3365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
33681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
33721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildImplicitValueInitExpr(T);
3374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
33751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
33771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we want the type as written?
3380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T;
33811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T = getDerived().TransformType(E->getType());
3386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
33891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
33931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
3396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
3397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
33981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       T, E->getRParenLoc());
3401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
34041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Init.isInvalid())
3411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
34121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Inits.push_back(Init.takeAs<Expr>());
3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
34161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move_arg(Inits),
3419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getRParenLoc());
3420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression.
3423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
3424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always
3425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to
3426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis.
3427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
34291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
3430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLabel());
3432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
3435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
34361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningStmtResult SubStmt
3437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubStmt.isInvalid())
3439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubStmt.get() == E->getSubStmt())
3443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
34441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildStmtExpr(E->getLParenLoc(),
3446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      move(SubStmt),
3447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      E->getRParenLoc());
3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
34521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
3453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T1, T2;
3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
3456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T1 = getDerived().TransformType(E->getArgType1());
3459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T1.isNull())
3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
34611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    T2 = getDerived().TransformType(E->getArgType2());
3463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T2.isNull())
3464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T1 == E->getArgType1() &&
3469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T2 == E->getArgType2())
34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
34711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
3473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 T1, T2, E->getRParenLoc());
3474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
34751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
34781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Cond.isInvalid())
3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (LHS.isInvalid())
3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (RHS.isInvalid())
3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
34901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Cond.get() == E->getCond() &&
3493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      LHS.get() == E->getLHS() &&
3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      RHS.get() == E->getRHS())
34951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
3498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(Cond), move(LHS), move(RHS),
3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->getRParenLoc());
3500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
35041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
35051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
3511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Callee.isInvalid())
3513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
3516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (First.isInvalid())
3517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Second(SemaRef);
3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->getNumArgs() == 2) {
3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Second = getDerived().TransformExpr(E->getArg(1));
3522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Second.isInvalid())
3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Callee.get() == E->getCallee() &&
3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.get() == E->getArg(0) &&
35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 E->getOperatorLoc(),
35341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                 move(Callee),
3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(First),
3536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 move(Second));
3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
35411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCallExpr(E);
3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    // FIXME: Source location isn't quite accurate.
35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SourceLocation TypeStartLoc
3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
35541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
3557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
35591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
35631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
35671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Poor source location information here.
35701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SourceLocation FakeLAngleLoc
3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeRParenLoc
3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(
3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  E->getSubExpr()->getSourceRange().getEnd());
3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
35771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              E->getStmtClass(),
3578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeLAngleLoc,
3579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              ExplicitTy,
3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
3581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRAngleLoc,
3582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move(SubExpr),
3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              FakeRParenLoc);
3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
35871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
35881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
3589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
35941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
35971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr(
36011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                CXXReinterpretCastExpr *E) {
3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
36071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().TransformCXXNamedCastExpr(E);
3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr(
36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                   CXXFunctionalCastExpr *E) {
3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType ExplicitTy;
3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  {
3617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
36181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (ExplicitTy.isNull())
3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ExplicitTy == E->getTypeAsWritten() &&
3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
36311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
36321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: The end of the type's source range is wrong
3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXFunctionalCastExpr(
3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExplicitTy,
3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      /*FIXME:*/E->getSubExpr()->getLocStart(),
3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   move(SubExpr),
3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getRParenLoc());
3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
36441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (E->isTypeOperand()) {
3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
36471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    QualType T = getDerived().TransformType(E->getTypeOperand());
3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (T.isNull())
3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
36511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        T == E->getTypeOperand())
3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.Owned(E->Retain());
36551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             /*FIXME:*/E->getLocStart(),
3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             T,
3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             E->getLocEnd());
3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
36611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // We don't know whether the expression is potentially evaluated until
3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // after we perform semantic analysis, so the expression is potentially
3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // potentially evaluated.
36651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EnterExpressionEvaluationContext Unevaluated(SemaRef,
3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                      Action::PotentiallyPotentiallyEvaluated);
36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
3669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
36711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getExprOperand())
36741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
36751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           /*FIXME:*/E->getLocStart(),
3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(SubExpr),
3679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->getLocEnd());
3680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
36831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
36841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
36851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
36911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXNullPtrLiteralExpr *E) {
36921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
36941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
36991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
37131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      SubExpr.get() == E->getSubExpr())
37201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
37271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
37281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ParmVarDecl *Param
3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
3730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Param)
3731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (getDerived().AlwaysRebuild() &&
3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Param == E->getParam())
3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDefaultArgExpr(Param);
3738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType())
37511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  T,
3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getRParenLoc());
3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
37621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VarDecl *Var
376343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor    = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Var)
3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Var == E->getVarDecl())
3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
37701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  /*FIXME:*/E->getStartLoc(),
3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  Var);
3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
37751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
37781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the type that we're allocating
3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType AllocType = getDerived().TransformType(E->getAllocatedType());
3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (AllocType.isNull())
3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the size of the array we're allocating (if any).
3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (ArraySize.isInvalid())
3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
37891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the placement arguments (if any).
3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
37971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    PlacementArgs.push_back(Arg.take());
3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
380243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor  // transform the constructor arguments (if any).
3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (Arg.isInvalid())
3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
38081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ConstructorArgs.push_back(Arg.take());
3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      AllocType == E->getAllocatedType() &&
3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ArraySize.get() == E->getArraySize() &&
3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
38171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXNewExpr(E->getLocStart(),
3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isGlobalNew(),
3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(PlacementArgs),
3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        E->isParenTypeId(),
3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        AllocType,
3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/SourceRange(),
3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move(ArraySize),
3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        /*FIXME:*/E->getLocStart(),
3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                        move_arg(ConstructorArgs),
38311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                        E->getLocEnd());
3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
38361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Operand.isInvalid())
3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
38401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
38421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Operand.get() == E->getArgument())
38431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
38441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isGlobalDelete(),
3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           E->isArrayForm(),
3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                           move(Operand));
3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3853a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
3854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                CXXPseudoDestructorExpr *E) {
3855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (Base.isInvalid())
3857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
38581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  NestedNameSpecifier *Qualifier
3860a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3861a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                E->getQualifierRange());
3862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier() && !Qualifier)
3863a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.ExprError();
38641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3865a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  QualType DestroyedType;
3866a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  {
3867a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
3868a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    DestroyedType = getDerived().TransformType(E->getDestroyedType());
3869a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    if (DestroyedType.isNull())
3870a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      return SemaRef.ExprError();
3871a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  }
38721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3873a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3874a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Base.get() == E->getBase() &&
3875a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      Qualifier == E->getQualifier() &&
3876a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor      DestroyedType == E->getDestroyedType())
3877a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    return SemaRef.Owned(E->Retain());
38781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3879a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
3880a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getOperatorLoc(),
3881a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->isArrow(),
3882a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getDestroyedTypeLoc(),
3883a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     DestroyedType,
3884a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     Qualifier,
3885a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor                                                     E->getQualifierRange());
3886a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
38871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3888a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived>
3889a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult
3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                              UnresolvedFunctionNameExpr *E) {
3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // There is no transformation we can apply to an unresolved function name.
38931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
38951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
38981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
39001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getQueriedType());
3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getQueriedType())
3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bad location information
3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation FakeLParenLoc
3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
39121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocStart(),
3915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            /*FIXME:*/FakeLParenLoc,
3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            T,
3917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLocEnd());
3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                E->getQualifierRange());
3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NamedDecl *ND
3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!ND)
3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!getDerived().AlwaysRebuild() &&
3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      NNS == E->getQualifier() &&
3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      ND == E->getDecl())
39371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildQualifiedDeclRefExpr(NNS,
3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getQualifierRange(),
3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  ND,
3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  E->getLocation(),
3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                  /*FIXME:*/false);
3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
39451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
39491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                    UnresolvedDeclRefExpr *E) {
3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  NestedNameSpecifier *NNS
3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getQualifierRange());
3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!NNS)
3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
395781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
395881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
395981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
39601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!getDerived().AlwaysRebuild() &&
3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      NNS == E->getQualifier() &&
3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Name == E->getDeclName())
39641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
39651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getQualifierRange(),
3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   Name,
3969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   E->getLocation(),
3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   /*FIXME:*/false);
3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
39751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = getDerived().TransformTemplateName(E->getTemplateName());
3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Template.isNull())
3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<TemplateArgument, 4> TransArgs;
3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
39831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateArgument TransArg
3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isNull())
3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    TransArgs.push_back(TransArg);
3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // compare template arguments (yet).
39931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
39941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // FIXME: It's possible that we'll find out now that the template name
3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // actually refers to a type, in which case the caller is actually dealing
3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // with a functional cast. Give a reasonable error message!
3997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getLAngleLoc(),
3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.data(),
4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            TransArgs.size(),
4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRAngleLoc());
4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
40061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                              getDerived().TransformDecl(E->getConstructor()));
4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
40211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       ArgEnd = E->arg_end();
4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
40271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
40371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              move_arg(Args));
4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression.
4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
40441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to
40451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the
4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself
4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique.
4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should
4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated.
4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor///
40611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new
40621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the
4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the
4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression.
4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries(
40681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                CXXExprWithTemporaries *E) {
4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SubExpr.isInvalid())
4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return SemaRef.Owned(
4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor           SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->shouldDestroyTemporaries()));
4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
40771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
40811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXTemporaryObjectExpr *E) {
4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getType());
4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  CXXConstructorDecl *Constructor
4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<CXXConstructorDecl>(
4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                            getDerived().TransformDecl(E->getConstructor()));
4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Constructor)
4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
40921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Args.reserve(E->getNumArgs());
40961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                         ArgEnd = E->arg_end();
4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
41021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back((Expr *)TransArg.release());
4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
41061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getType() &&
4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Constructor == E->getConstructor() &&
4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.Owned(E->Retain());
41121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Bogus location information
4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SourceLocation CommaLoc;
4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Args.size() > 1) {
4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Expr *First = (Expr *)Args[0];
41171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    CommaLoc
4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    T,
4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                /*FIXME:*/E->getTypeBeginLoc(),
4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    move_arg(Args),
4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    &CommaLoc,
4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                    E->getLocEnd());
4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                            CXXUnresolvedConstructExpr *E) {
4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType T = getDerived().TransformType(E->getTypeAsWritten());
4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (T.isNull())
4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                             ArgEnd = E->arg_end();
4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor       Arg != ArgEnd; ++Arg) {
4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (TransArg.isInvalid())
4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
41461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    FakeCommaLocs.push_back(
4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                        SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Args.push_back(TransArg.takeAs<Expr>());
4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
41521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      T == E->getTypeAsWritten() &&
4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
41561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
41571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: we're faking the locations of the commas
4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        T,
4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getLParenLoc(),
4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        move_arg(Args),
4163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        FakeCommaLocs.data(),
4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                        E->getRParenLoc());
4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
41661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
41701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                  CXXUnresolvedMemberExpr *E) {
4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Transform the base of the expression.
4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Base.isInvalid())
4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
41751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4176a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  Sema::TypeTy *ObjectType = 0;
41771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
4178a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              E->getOperatorLoc(),
4179a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                      E->isArrow()? tok::arrow : tok::period,
4180a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                              ObjectType);
4181a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (Base.isInvalid())
4182a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    return SemaRef.ExprError();
41831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: The first qualifier found might be a template type parameter,
41853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // in which case there is no transformed declaration to refer to (it might
41863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // refer to a built-in type!).
4187c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  NamedDecl *FirstQualifierInScope
4188c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    = cast_or_null<NamedDecl>(
4189c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor              getDerived().TransformDecl(E->getFirstQualifierFoundInScope()));
41901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4191a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  NestedNameSpecifier *Qualifier = 0;
4192a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (E->getQualifier()) {
4193a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4194a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                      E->getQualifierRange(),
4195c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                      QualType::getFromOpaquePtr(ObjectType),
4196c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope);
4197a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    if (!Qualifier)
4198a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor      return SemaRef.ExprError();
4199a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
42001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName Name
420281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc());
420381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor  if (!Name)
420481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor    return SemaRef.ExprError();
42051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (!E->hasExplicitTemplateArgumentList()) {
42073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // This is a reference to a member without an explicitly-specified
42083b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // template argument list. Optimize for this common case.
42093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (!getDerived().AlwaysRebuild() &&
42103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Base.get() == E->getBase() &&
42113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Qualifier == E->getQualifier() &&
42123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        Name == E->getMember() &&
42133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor        FirstQualifierInScope == E->getFirstQualifierFoundInScope())
42141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return SemaRef.Owned(E->Retain());
42151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
42173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->isArrow(),
42183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getOperatorLoc(),
42193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Qualifier,
42203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getQualifierRange(),
42213b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       Name,
42223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       E->getMemberLoc(),
42233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                       FirstQualifierInScope);
42243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
42253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor
42263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This is an ugly hack, which forces the same template name to
42273b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // be looked up multiple times. Yuck!
42283b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  // FIXME: This also won't work for, e.g., x->template operator+<int>
42293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  TemplateName OrigTemplateName
42303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo());
42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  TemplateName Template
42331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = getDerived().TransformTemplateName(OrigTemplateName,
42343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                       QualType::getFromOpaquePtr(ObjectType));
42353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  if (Template.isNull())
42363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    return SemaRef.ExprError();
42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  llvm::SmallVector<TemplateArgument, 4> TransArgs;
42393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
42401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TemplateArgument TransArg
42413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
42423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    if (TransArg.isNull())
42433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor      return SemaRef.ExprError();
42441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    TransArgs.push_back(TransArg);
42463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
42471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->isArrow(),
4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                     E->getOperatorLoc(),
4251a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     Qualifier,
4252a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                     E->getQualifierRange(),
42533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     Template,
4254c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                     E->getMemberLoc(),
42553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     FirstQualifierInScope,
42563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     E->getLAngleLoc(),
42573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     TransArgs.data(),
42583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     TransArgs.size(),
42593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                     E->getRAngleLoc());
4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
42641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
42651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
42691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
42701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
4271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: poor source location
4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (EncodedType.isNull())
4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      EncodedType == E->getEncodedType())
42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            EncodedType,
4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                            E->getRParenLoc());
4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
42851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult
42881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
42911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
42941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
42951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
42961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
42971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
43021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
43031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ObjCProtocolDecl *Protocol
4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = cast_or_null<ObjCProtocolDecl>(
4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                getDerived().TransformDecl(E->getProtocol()));
4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!Protocol)
4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Protocol == E->getProtocol())
43111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildObjCProtocolExpr(Protocol,
4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getAtLoc(),
4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              /*FIXME:*/E->getAtLoc(),
4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                              E->getRParenLoc());
43181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
43231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
43261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
43341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
433909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
43401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          ObjCImplicitSetterGetterRefExpr *E) {
4341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
43431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
43481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
43511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
43561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform Objective-C expressions yet");
43591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
43641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool ArgumentChanged = false;
4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (SubExpr.isInvalid())
4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return SemaRef.ExprError();
43711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    SubExprs.push_back(SubExpr.takeAs<Expr>());
4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
43751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (!getDerived().AlwaysRebuild() &&
4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      !ArgumentChanged)
43781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return SemaRef.Owned(E->Retain());
43791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               move_arg(SubExprs),
4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                               E->getRParenLoc());
4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
43871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block expressions yet");
43901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
43931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
43941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
43951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Implement this!
4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  assert(false && "Cannot transform block-related expressions yet");
43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Owned(E->Retain());
4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
44001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction
4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===//
4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
44051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
44070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildPointerType(PointeeType, Qualifiers(),
4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseLocation(),
4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                  getDerived().getBaseEntity());
4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
44140953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(),
4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseLocation(),
4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                       getDerived().getBaseEntity());
4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
44201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
44220953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, true, Qualifiers(),
4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    getDerived().getBaseLocation(),
4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                    getDerived().getBaseEntity());
4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor
44271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived>
44281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
44300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildReferenceType(ReferentType, false, Qualifiers(),
4431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    getDerived().getBaseLocation(),
4432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    getDerived().getBaseEntity());
4433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
44361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
4437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          QualType ClassType) {
44380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
4439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        getDerived().getBaseLocation(),
4440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        getDerived().getBaseEntity());
4441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
44441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
4445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         ArrayType::ArraySizeModifier SizeMod,
4447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         const llvm::APInt *Size,
4448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         Expr *SizeExpr,
4449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         unsigned IndexTypeQuals,
4450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                         SourceRange BracketsRange) {
4451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeExpr || !Size)
4452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
4453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  IndexTypeQuals, BracketsRange,
4454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                  getDerived().getBaseEntity());
44551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
44561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  QualType Types[] = {
44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
44591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
4460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  };
4461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
4462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  QualType SizeType;
4463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  for (unsigned I = 0; I != NumTypes; ++I)
4464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
4465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      SizeType = Types[I];
4466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor      break;
4467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    }
44681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  if (SizeType.isNull())
4470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor    SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
44711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
44731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
4474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                IndexTypeQuals, BracketsRange,
44751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                getDerived().getBaseEntity());
4476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
44771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
44791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
44801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
4481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 ArrayType::ArraySizeModifier SizeMod,
4482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const llvm::APInt &Size,
4483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals) {
44841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
4485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                        IndexTypeQuals, SourceRange());
4486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
44891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
44901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
4491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals) {
44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
4494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, SourceRange());
4495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
44981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
44991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
4500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                 ExprArg SizeExpr,
4502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 unsigned IndexTypeQuals,
4503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceRange BracketsRange) {
45041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
4506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
4507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
45101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
45111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
4512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                          ArrayType::ArraySizeModifier SizeMod,
4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                       ExprArg SizeExpr,
4514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                       unsigned IndexTypeQuals,
4515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   SourceRange BracketsRange) {
45161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
4517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       SizeExpr.takeAs<Expr>(),
4518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                       IndexTypeQuals, BracketsRange);
4519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
4523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                   unsigned NumElements) {
4524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: semantic checking!
4525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getVectorType(ElementType, NumElements);
4526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
45271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
4530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                      unsigned NumElements,
4531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 SourceLocation AttributeLoc) {
4532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
4533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                          NumElements, true);
4534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  IntegerLiteral *VectorSize
45351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
4536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                           AttributeLoc);
4537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
4538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                    AttributeLoc);
4539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
45401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
45421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType
45431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                           ExprArg SizeExpr,
4545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                  SourceLocation AttributeLoc) {
4546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
4547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
45481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
45511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          QualType *ParamTypes,
4552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        unsigned NumParamTypes,
45531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                          bool Variadic,
4554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                          unsigned Quals) {
45551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
4556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   Quals,
4557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseLocation(),
4558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                   getDerived().getBaseEntity());
4559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
45601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
4563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
4564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
4568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.Context.getTypeOfType(Underlying);
4569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
4573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
4574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
4575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived>
4577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
4578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                        TemplateName Template,
4579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                 const TemplateArgument *Args,
4580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor                                                           unsigned NumArgs) {
4581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  // FIXME: Missing source locations for the template name, <, >.
4582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor  return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(),
45831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     SourceLocation(), Args, NumArgs,
45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     SourceLocation());
4585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}
45861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4587dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
4588dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
4589dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4590dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
4591a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor                                                   IdentifierInfo &II,
4592c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                   QualType ObjectType,
4593c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                             NamedDecl *FirstQualifierInScope) {
4594dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  CXXScopeSpec SS;
4595dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  // FIXME: The source location information is all wrong.
4596dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setRange(Range);
4597dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SS.setScopeRep(Prefix);
4598dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return static_cast<NestedNameSpecifier *>(
45991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                    SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
4600495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        Range.getEnd(), II,
4601c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        ObjectType,
4602c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor                                                        FirstQualifierInScope,
4603495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor                                                        false));
4604dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
4605dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
4606dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
4607dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
4608dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4609dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
4610dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   NamespaceDecl *NS) {
4611dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
4612dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
4613dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor
4614dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived>
4615dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier *
4616dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4617dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   SourceRange Range,
4618dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   bool TemplateKW,
4619dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                                   QualType T) {
4620dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  if (T->isDependentType() || T->isRecordType() ||
4621dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor      (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
46220953e767ff7817f97b3ab20896b229891eeff45bJohn McCall    assert(!T.hasQualifiers() && "Can't get cv-qualifiers here");
4623dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor    return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
4624dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor                                       T.getTypePtr());
4625dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  }
46261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4627dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
4628dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor  return 0;
4629dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor}
46301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4631d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
46321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
4633d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4634d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
4635d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            TemplateDecl *Template) {
46361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
4637d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                                  Template);
4638d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
4639d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
4640d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
46411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
4642d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4643d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            bool TemplateKW,
4644d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor                                            OverloadedFunctionDecl *Ovl) {
4645d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
4646d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
4647d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor
4648d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived>
46491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName
4650d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
46513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            const IdentifierInfo &II,
46523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                            QualType ObjectType) {
4653d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  CXXScopeSpec SS;
4654d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor  SS.setRange(SourceRange(getDerived().getBaseLocation()));
46551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  SS.setScopeRep(Qualifier);
46563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  return getSema().ActOnDependentTemplateName(
46573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
46583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              II,
46593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                      /*FIXME:*/getDerived().getBaseLocation(),
46603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              SS,
46613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                              ObjectType.getAsOpaquePtr())
46623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor           .template getAsVal<TemplateName>();
4663d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor}
46641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived>
46661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult
4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
4668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   SourceLocation OpLoc,
4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Callee,
4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg First,
4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor                                                   ExprArg Second) {
4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *FirstExpr = (Expr *)First.get();
4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *SecondExpr = (Expr *)Second.get();
4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
46751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Determine whether this should be a builtin operation.
4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (SecondExpr == 0 || isPostIncDec) {
4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    if (!FirstExpr->getType()->isOverloadableType()) {
4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // The argument is not of overloadable type, so try to create a
4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // built-in unary operation.
46811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      UnaryOperator::Opcode Opc
4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
46831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  } else {
46871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!FirstExpr->getType()->isOverloadableType() &&
4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        !SecondExpr->getType()->isOverloadableType()) {
4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // Neither of the arguments is an overloadable type, so try to
4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      // create a built-in binary operation.
4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
46921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OwningExprResult Result
4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      if (Result.isInvalid())
4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor        return SemaRef.ExprError();
46961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      First.release();
4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      Second.release();
4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      return move(Result);
4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    }
4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Compute the transformed set of functions (and function templates) to be
4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // used during overload resolution.
4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Sema::FunctionSet Functions;
47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclRefExpr *DRE
47088f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor    = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
47091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // FIXME: Do we have to check
4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // IsAcceptableNonMemberOperatorCandidate for each of these?
47128f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor  for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    Functions.insert(*F);
47141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Add any functions found via argument-dependent lookup.
4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Expr *Args[2] = { FirstExpr, SecondExpr };
4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  unsigned NumArgs = 1 + (SecondExpr != 0);
47181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DeclarationName OpName
4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions);
47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for unary operators.
4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (NumArgs == 1 || isPostIncDec) {
47241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    UnaryOperator::Opcode Opc
4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor      = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  }
47281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  // Create the overloaded operator invocation for binary operators.
47301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  BinaryOperator::Opcode Opc =
4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    BinaryOperator::getOverloadedOpcode(Op);
47321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  OwningExprResult Result
4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  if (Result.isInvalid())
4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor    return SemaRef.ExprError();
47361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  First.release();
4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor  Second.release();
47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return move(Result);
4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor}
47411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4742577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang
4743577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor
4744577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H
4745